버튼을 클릭 할 때 원형 잔물결을 만드는 방법은 무엇입니까?


121

배경

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 왜? 둘 다 잘 작동합니다. 그들 사이에 더 좋은 것은 없습니다.
안드로이드 개발자

답변:


17

이미 배경 이미지가있는 경우 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>

287

AppCompat 테마를 사용하는 경우보기의 배경을 다음과 같이 설정할 수 있습니다.

android:background="?selectableItemBackgroundBorderless"

21 이상에는 원형 잔물결이 추가되고 21 이하에는 사각형 배경이 추가됩니다.


좋은. 어떻게 든 색상을 설정할 수 있습니까?
안드로이드 개발자

4
API 23에서 'up'배경은 selectbleItemBackgroundBorderless에 비해 절반 크기로 보입니다
snodnipper

3
좋은 답변입니다. ty
Skywalker

1
@androiddeveloper, styles.xml에서 아래와 같이 colorControlHighlight를 설정하여 색상을 설정할 수 있습니다. <item name = "colorControlHighlight"> # F00 </ item>
bond

3
다른 레이아웃 내 android:clipChildren="false"에서 사용하는 경우 애니메이션이 전파 될 수 있도록 레이아웃에서도 필요할 수 있습니다 .
Tanasis 2018

83

둥근 물결 효과가있는 또 다른 속성, 특히 작업 표시 줄 :

android:background="?actionBarItemBackground"

UPD : 리플 색상은 다음 속성으로 변경할 수 있습니다.

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

그러나이 속성은 모든 기본 잔물결 효과에 적용됩니다.


그것을 사용자 정의하는 방법이 있습니까? 예를 들어 색상? 스타일에 뭔가? 아니면 더 구체적으로보기 XML 태그 자체에서?
안드로이드 개발자

나는 오늘이 문제를 해결했으며 위의 답변이 필요에 따라 작동하지 않았습니다. 색상은 스타일에서 사용자 정의 할 수 있다고 가정하지만 확실히 뷰에서는 그렇지 않습니다.
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>

내 코드에 뭔가 있습니다. 당신은 당신의 색상 : 사용할 수 있습니다
토마스 R.

Lollipop 이전에있는 경우 기본 선택기를 어떻게 사용합니까? 또한 다이얼러에있는 것과 동일한 색상을 사용합니까?
안드로이드 개발자

2
drawables-v21 폴더에 잔물결 드로어 블을 넣을 수 있습니다. 그리고 pre L의 경우 간단한 상태 드로어 블을 사용하십시오. 동일한 파일 이름을 사용하여 드로어 블 (기본) 폴더에 넣습니다.
Thomas R.

2
스타일을 만들 수도 있습니다. values-v21 폴더에서 새 스타일을 만들고 잔물결 드로어 블을 배경으로 설정합니다. 그리고 pre L의 경우, 즉 값 폴더 styles.xml에 동일한 스타일에 대한 "selectableItemBackground"속성을 배경으로 넣으십시오.
Thomas R.

1
앱에서 사용되는 다른 기본 잔물결 효과와 동일한 잔물결 색상을 원하면 "? attr / colorControlHighlight"를 색상으로 사용하십시오.
alexbchr

27

이 배경을보기에 추가하기 만하면됩니다.

android:background=?android:attr/actionBarItemBackground


18

android:radiusxml의 ​​속성을 사용하여 원 리플 드로어 블을 만들 수 있습니다 .

예:

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


1

시험:

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

1
답변으로 코드 만 게시하지 말고 코드가하는 일과 질문의 문제를 해결하는 방법에 대한 설명을 포함하십시오. 설명이있는 답변은 일반적으로 품질이 더 높고 찬성 투표를 유도 할 가능성이 더 높습니다.
Mark Rotteveel

actionBarItemBackground를 배경으로 설정하는 것보다 부드럽습니다. 그러나 여전히 액션 바 애니메이션 자체와 똑같지는 않습니다.
coolcool1994

1

원 경계를 넘지 않는 잔물결 효과를 원한다면이 코드를 확인할 수 있습니다. 그것은 나를 위해 완벽하게 작동합니다. ripple_blue.xml에 id = @ android : id / mask를 제공해야합니다.

<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

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.