Làm thế nào để tạo một gợn tròn trên một nút khi nó được nhấp?


121

Lý lịch

Trên ứng dụng trình quay số của Android, khi bạn bắt đầu tìm kiếm thứ gì đó và bạn nhấp vào nút mũi tên ở bên trái của EditText, bạn sẽ có được hiệu ứng gợn tròn trên nó:

nhập mô tả hình ảnh ở đây

Vấn đề

Tôi cũng đã cố gắng để có nó, nhưng tôi có một hình chữ nhật:

    <ImageButton
        android:id="@+id/navButton"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="8dp"
        android:background="?android:attr/selectableItemBackground"
        android:src="@drawable/search_ic_back_arrow"/>

Câu hỏi

Làm cách nào để làm cho nút có hiệu ứng gợn tròn khi được nhấp? Tôi có phải tạo ra một drawable mới, hoặc có một cách xây dựng cho điều đó?


2
github.com/traex/RípEffect hãy thử điều này
nhanh vào

câu trả lời có thể có ở đây stackoverflow.com/questions/33477025/ Cách
Amrish Kakadiya

1
Cân nhắc thay đổi câu trả lời đã chọn của bạn thành câu trả lời nhiều nhất, vì nó thực sự giải quyết được vấn đề
Jeff Barger

@JeffBarger Tại sao? Cả hai đều hoạt động tốt. Không có ai tốt hơn giữa họ.
nhà phát triển Android

Câu trả lời:


17

Nếu bạn đã có một hình ảnh nền, đây là một ví dụ về một gợn sóng trông gần với selectableItemBackgroundBorderless:

            <ImageButton
                android:id="@+id/btn_show_filter_dialog"
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:background="@drawable/ic_filter_state"/>

ic_filter_state.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/state_pressed_ripple"/>
    <item
        android:state_enabled="true"
        android:drawable="@drawable/ic_filter" />
</selector>

state_pressed_ripple.xml: (độ mờ được đặt thành 10% trên nền trắng) 1AFFFFFF

 <?xml version="1.0" encoding="UTF-8"?>    
    <ripple xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <shape android:shape="oval">
                <solid android:color="#1AFFFFFF"/>
            </shape>
            <color android:color="#FFF"/>
        </item>
    </ripple>

285

Nếu bạn đang sử dụng chủ đề AppCompat, thì bạn có thể đặt nền của chế độ xem là:

android:background="?selectableItemBackgroundBorderless"

Điều này sẽ thêm gợn tròn trên 21 và trên và nền vuông trên dưới 21.


Đẹp. Tôi cũng có thể thiết lập màu sắc của nó bằng cách nào đó?
nhà phát triển Android

4
trong API 23, nền 'up' dường như chỉ bằng một nửa so với selectbleItemBackgroundBorderless
snodnipper 11/03/2016

3
Đẹp, câu trả lời tốt nhất. ty
Skywalker

1
@androiddeveloper, màu sắc có thể được đặt bằng cách đặt colorControlHighlight như bên dưới trong tệp styleDB của bạn <item name = "colorControlHighlight"> # F00 </ item>
bond

3
Nếu bạn đang sử dụng nó bên trong các bố cục khác, bạn cũng có thể cần android:clipChildren="false"trong các bố cục để cho phép hoạt ảnh lan truyền.
Tanocation

82

Một thuộc tính khác với hiệu ứng gợn tròn, đặc biệt dành cho thanh hành động:

android:background="?actionBarItemBackground"

CẬP NHẬT : Màu gợn có thể được thay đổi bởi thuộc tính này:

<!--somewhere in styles-->
<item name="colorControlHighlight">your_color_here</item>

Nhưng hãy nhớ, thuộc tính này áp dụng cho tất cả các hiệu ứng gợn mặc định.


Bất kỳ cách nào để tùy chỉnh nó? Ví dụ màu sắc? Có lẽ một cái gì đó trong phong cách? Hay cụ thể hơn nữa là trong chính thẻ xem XML?
nhà phát triển Android

Tôi không biết, hôm nay tôi đã giải quyết vấn đề này và các câu trả lời ở trên không hoạt động như tôi cần. Tôi giả định rằng màu sắc có thể được tùy chỉnh theo phong cách, nhưng chắc chắn không phải trong chế độ xem.
Anrimian

1
Đây chính xác là hiệu ứng đúng mà tôi đang tìm kiếm. Nhân tiện, bạn có thể đề cập đến nơi để tìm thuộc tính này, nó dường như không được ghi lại.
Jack Wang

2
Trả lời câu hỏi OP. Shoud được đánh dấu là câu trả lời tốt nhất. +1
Corbella

2
@MeysamHadigheh ?là lối tắt cho?attr/
musooff

47

Tạo và thiết lập một gợn vẽ có thể vẽ làm nền. Một cái gì đó như thế này.

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/grey_15">
    <item android:id="@android:id/mask">
        <shape android:shape="oval">
            <solid android:color="?android:colorPrimary"/>
        </shape>
        <color android:color="@color/white"/>
    </item>
</ripple>

Đó là một cái gì đó trong mã của tôi. Bạn có thể sử dụng màu sắc của mình :)
Thomas R.

Làm cách nào để sử dụng bộ chọn mặc định trong trường hợp nó trên Lollipop trước? Ngoài ra, nó có sử dụng các màu giống như màu trên trình quay số không?
nhà phát triển Android

2
Bạn có thể đặt Ripple drawable trong thư mục drawables-v21 của bạn. Và đối với pre L sử dụng trạng thái đơn giản drawable. Sử dụng cùng tên tệp và đặt nó vào thư mục drawable (mặc định).
Thomas R.

2
Bạn cũng có thể tạo một phong cách. Trong thư mục value-v21 tạo một kiểu mới và đặt gợn có thể vẽ được làm nền. Và đối với L trước, tức là trong thư mục giá trị của bạn, kiểu tệp XML đặt làm nền cho thuộc tính "selectableItemBackground" cho cùng một kiểu.
Thomas R.

1
Nếu bạn muốn có màu gợn giống như các hiệu ứng gợn mặc định khác được sử dụng trong ứng dụng, hãy sử dụng "? Attr / colorControlHighlight" làm màu.
alexbchr

26

Chỉ cần thêm nền này để xem của bạn

android:background=?android:attr/actionBarItemBackground


18

Bạn có thể tạo gợn tròn có thể vẽ bằng cách sử dụng android:radiusthuộc tính trong xml.

Thí dụ:

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="your_color"
    android:radius="your_radius" />

Hãy chú ý, rằng bạn your_radiusnên nhỏ hơn chiều rộng và chiều cao của bạn. Ví dụ: nếu bạn có chế độ xem với kích thước 60dp x 60dp your_radiusthì phải ở gần 30dp(chiều rộng / 2 hoặc chiều cao / 2).

Hoạt động trên Android 5.0 trở lên.


3

Nếu bạn muốn các tệp XML chung hơn, tôi có hai tệp:

1) btn_ripple_background với mã:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:state_pressed="true"
    android:state_enabled="true"
    android:drawable="@drawable/ripple_circular_shape"/>
</selector>

2) ripple_circuler_shape với mã:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/btn_state_pressed_text_color"
    android:shape="oval">
    <solid android:color="@color/btn_state_pressed_text_color" />
</shape>

cuối cùng là cách sử dụng:android:foreground="@drawable/ripple_btn_background"


1

Thử:

android:background="@android:color/transparent"
android:clickable="true"
android:focusable="true"
android:foreground="?actionBarItemBackground"

1
Vui lòng không chỉ đăng mã dưới dạng câu trả lời, nhưng bao gồm phần giải thích mã của bạn làm gì và cách giải quyết vấn đề của câu hỏi. Câu trả lời với một lời giải thích thường có chất lượng cao hơn, và có nhiều khả năng thu hút upvote.
Mark Rotteveel

Nhẹ nhàng hơn so với cài đặt actionBarItemBackground làm nền. Nhưng vẫn không chính xác như hoạt hình thanh hành động chính nó.
coolcool1994

1

Nếu bạn muốn hiệu ứng gợn sẽ không vượt qua ranh giới vòng tròn, bạn có thể kiểm tra mã này. Nó làm việc cho tôi một cách hoàn hảo. Chỉ cần nhớ, bạn phải cung cấp id = @ android: id / mask trong ripple_blue.xml

<ImageButton
    android:id="@+id/send_password_to_mail_image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/ripple_blue"
    android:src="@drawable/ic_filter" />

ripple_blue.xml

<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/colorRipple">

    <item android:id="@android:id/mask">

        <shape android:shape="oval">
            <solid android:color="@color/colorWindowBackground"/>
        </shape>

    </item>

    <item android:id="@android:id/background">

        <shape android:shape="oval">
            <solid android:color="@color/colorWindowBackground"/>
        </shape>

    </item>

</ripple>

color.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <color name="colorWindowBackground">#F2F5FC</color>
    <color name="colorRipple">#0288d1</color>
</resources>


0

Trong Kotlin / Java, bạn có thể làm như sau

fun View.applyCircularRippleEffect() {
    val backgroundResId = context.getResource(android.R.attr.actionBarItemBackground)

    if (backgroundResId != 0) {
        setBackgroundResource(backgroundResId)
        isClickable = true
        isFocusable = true
    }
}

// getResource extension
fun Context.getResource(resourceId: Int): Int {
    val out = TypedValue()
    theme.resolveAttribute(resourceId, out, true)

    return out.resourceId
}


@RahulMandaliya cảm ơn bạn đã bình luận. Xấu của tôi, đó là phương pháp mở rộng tùy chỉnh của tôi. Đã thêm nó vào câu trả lời
mihails.kuzmins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.