วิธีสร้างระลอกวงกลมบนปุ่มเมื่อมีการคลิก?


122

พื้นหลัง

ในแอปโทรออกของ Android เมื่อคุณเริ่มค้นหาบางสิ่งและคุณคลิกปุ่มลูกศรทางด้านซ้ายของ EditText คุณจะได้รับเอฟเฟกต์ระลอกคลื่นวงกลม:

ใส่คำอธิบายภาพที่นี่

ปัญหา

ฉันพยายามจะมีมันเหมือนกัน แต่ฉันมีรูปสี่เหลี่ยม:

    <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"/>

คำถาม

ฉันจะทำให้ปุ่มมีเอฟเฟกต์ระลอกคลื่นวงกลมเมื่อถูกคลิกได้อย่างไร? ฉันต้องสร้างสิ่งที่เบิกได้ใหม่หรือมีวิธีการสร้างขึ้นมา?



คำตอบที่เป็นไปได้อยู่ที่นี่stackoverflow.com/questions/33477025/…
Amrish Kakadiya

1
ลองเปลี่ยนคำตอบที่คุณเลือกเป็นคำตอบที่มีคนโหวตมากที่สุดเพราะมันช่วยแก้ปัญหาได้จริง
Jeff Barger

@JeffBarger ทำไม? ทั้งสองทำงานได้ดี ระหว่างพวกเขาไม่มีใครดีกว่ากัน
นักพัฒนา Android

คำตอบ:


18

หากคุณมีภาพพื้นหลังอยู่แล้วนี่คือตัวอย่างของการกระเพื่อมที่มีลักษณะใกล้เคียงกับ 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: (ตั้งค่าความทึบเป็น 10% บนพื้นหลังสีขาว) 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>

290

หากคุณใช้ธีม AppCompat คุณสามารถตั้งค่าพื้นหลังของมุมมองเป็น:

android:background="?selectableItemBackgroundBorderless"

สิ่งนี้จะเพิ่มการกระเพื่อมแบบวงกลมที่ 21 ขึ้นไปและพื้นหลังสี่เหลี่ยมด้านล่าง 21


ดี ฉันสามารถกำหนดสีของมันได้หรือไม่?
นักพัฒนา Android

4
ใน API 23 พื้นหลัง 'ขึ้น' ดูเหมือนจะมีขนาดครึ่งหนึ่งเมื่อเทียบกับ selectbleItemBackgroundBorderless
snodnipper

3
ดีคำตอบที่ดีที่สุด ty
Skywalker

1
@androiddeveloper สีสามารถตั้งค่าได้โดยการตั้งค่า colorControlHighlight เช่นนี้ใน styles.xml คุณ <ชื่อรายการ = "colorControlHighlight"> # F00 </ item>
พันธบัตร

4
หากคุณกำลังใช้มันภายในเลย์เอาต์อื่น ๆ คุณอาจต้องใช้android:clipChildren="false"ในเลย์เอาต์ด้วยเพื่อให้แอนิเมชั่นเผยแพร่
Tanasis

83

คุณสมบัติอื่นที่มีเอฟเฟกต์ระลอกคลื่นโดยเฉพาะสำหรับแถบการกระทำ:

android:background="?actionBarItemBackground"

UPD : สีระลอกสามารถเปลี่ยนได้โดยแอตทริบิวต์นี้:

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

แต่โปรดทราบว่าแอตทริบิวต์นี้ใช้กับเอฟเฟกต์การกระเพื่อมเริ่มต้นทั้งหมด


วิธีใดในการปรับแต่ง? ตัวอย่างเช่นสี? อาจมีบางอย่างในรูปแบบ? หรือโดยเฉพาะอย่างยิ่งในแท็ก XML มุมมองเอง?
นักพัฒนา Android

ฉันไม่รู้ว่าวันนี้ฉันแก้ปัญหานี้ได้แล้วและคำตอบข้างต้นไม่ได้ผลตามที่ฉันต้องการ ฉันคิดว่าสีสามารถปรับแต่งในสไตล์ได้ แต่ไม่แน่นอนในมุมมอง
Anrimian

1
นี่คือเอฟเฟกต์ที่เหมาะสมที่ฉันกำลังมองหา อย่างไรก็ตามคุณสามารถระบุได้ว่าจะหาแอตทริบิวต์นี้ได้ที่ไหนดูเหมือนว่าจะไม่ได้รับการบันทึกไว้
Jack Wang

2
ตอบคำถาม OP Shoud ถูกทำเครื่องหมายว่าเป็นคำตอบที่ดีที่สุด +1
Corbella

2
@MeysamHadigheh ?เป็นทางลัดสำหรับ?attr/
musooff

47

สร้างและตั้งค่าระลอกคลื่นที่วาดได้เป็นพื้นหลัง อะไรทำนองนี้.

<?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>

มันเป็นรหัสของฉัน คุณสามารถใช้สีของคุณได้ :)
Thomas R.

ฉันจะใช้ตัวเลือกเริ่มต้นได้อย่างไรในกรณีที่อยู่ใน Pre-Lollipop นอกจากนี้ยังใช้สีเดียวกับสีบนแป้นหมุนหมายเลขหรือไม่?
นักพัฒนา Android

2
คุณสามารถใส่ ripple drawable ในโฟลเดอร์ drawables-v21 ของคุณได้ และสำหรับ pre L ให้ใช้สถานะง่ายๆที่ดึงได้ ใช้ชื่อไฟล์เดียวกันและใส่ลงในโฟลเดอร์ drawable (ค่าเริ่มต้น)
Thomas R.

2
คุณยังสามารถสร้างสไตล์ ในโฟลเดอร์ values-v21 ให้สร้างสไตล์ใหม่และตั้งค่า ripple drawable เป็นพื้นหลัง และสำหรับก่อน L เช่นในโฟลเดอร์ค่าของคุณ styles.xml ใส่แอตทริบิวต์ "selectableItemBackground" เป็นพื้นหลังสำหรับสไตล์เดียวกัน
Thomas R.

1
หากคุณต้องการสีระลอกเดียวกับเอฟเฟ็กต์ระลอกเริ่มต้นอื่น ๆ ที่ใช้ในแอปให้ใช้ "? attr / colorControlHighlight" เป็นสี
alexbchr

27

เพียงแค่เพิ่มพื้นหลังนี้ในมุมมองของคุณ

android:background=?android:attr/actionBarItemBackground


19

คุณสามารถสร้างการกระเพื่อมของวงกลมที่วาดได้โดยใช้android:radiusแอตทริบิวต์ใน xml

ตัวอย่าง:

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

สังเกตว่าคุณyour_radiusควรน้อยกว่าความกว้างและความสูงของมุมมอง ตัวอย่างเช่นหากคุณมีมุมมองที่มีขนาด60dp x 60dp your_radiusควรอยู่ใกล้30dp(กว้าง / 2 หรือสูง / 2)

ทำงานบน Android 5.0 ขึ้นไป


3

หากคุณต้องการไฟล์ XML ทั่วไปเพิ่มเติมฉันมีสองไฟล์:

1) btn_ripple_backgroundพร้อมรหัส:

<?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พร้อมรหัส:

<?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>

ในที่สุดการใช้งาน:android:foreground="@drawable/ripple_btn_background"


2

หากคุณต้องการเอฟเฟกต์ระลอกคลื่นซึ่งจะไม่ข้ามขอบเขตวงกลมคุณสามารถตรวจสอบรหัสนี้ได้ มันเหมาะสำหรับฉันอย่างสมบูรณ์แบบ จำไว้ว่าคุณต้องให้ id = @ android: id / mask ใน 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>

1

ลอง:

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

1
โปรดอย่าโพสต์โค้ดเพื่อเป็นคำตอบเท่านั้น แต่ต้องใส่คำอธิบายว่าโค้ดของคุณใช้ทำอะไรและแก้ปัญหาของคำถามได้อย่างไร คำตอบพร้อมคำอธิบายมักจะมีคุณภาพสูงกว่าและมีแนวโน้มที่จะดึงดูดการโหวตได้มากกว่า
Mark Rotteveel

นุ่มนวลกว่าการตั้งค่า actionBarItemBackground เป็นพื้นหลัง แต่ก็ยังไม่เหมือนกับแอนิเมชั่นแถบการกระทำ
coolcool1994

1

เพียงเพิ่มรายการนี้ในไฟล์

           <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="?android:attr/actionBarItemBackground"
                app:srcCompat="@drawable/ic_arrow_drop_down_black_24dp" />

1
ดูเหมือนว่าจะเหมือนกับนี้: stackoverflow.com/a/54440773/878126
นักพัฒนา Android

0

ใน Kotlin / Java คุณสามารถทำสิ่งต่อไปนี้ได้

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
}

context.getResource ไม่พบ
Rahul Mandaliya

@RahulMandaliya ขอบคุณสำหรับความคิดเห็น ไม่ดีของฉันมันเป็นวิธีการขยายที่กำหนดเองของฉัน เพิ่มเข้าไปในคำตอบ
mihails.kuzmins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.