간단한 레이아웃에서 파급 효과를 만드는 방법


112

레이아웃을 터치 할 때 간단한 선형 / 상대 레이아웃에서 어떻게 물결 효과를 낼 수 있습니까?

레이아웃의 배경을 다음과 같이 설정해 보았습니다.

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorControlHighlight" >

    <item android:drawable="@android:color/white"/>

</ripple>

그러나 레이아웃을 만질 때 평범한 흰색 배경 만 보이고 파급 효과가 없습니다. 내가 뭘 잘못하고 있죠?

편집하다:

참고로 내 레이아웃 xml 파일은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:background="@drawable/test"
        android:clickable="true">
    </RelativeLayout>

2
잔물결을 호스팅하는보기를 활성화하고 클릭하거나 초점을 맞출 수 있어야합니다.
alanv 2014

감사합니다 Alanv, 내 답변은 아래를 참조하십시오. 기본적으로 내 레이아웃을 클릭 가능한 것으로 표시하고 싶지만 여전히 작동하지 않습니다.
Zach

또한 <item android:drawable="@android:color/white"/>섹션을 제거하면 제대로 작동합니다 . 따라서 레이아웃에 배경색을 원할 경우 이것이 어떻게 작동해야하는지 잘 모르겠습니다. 배경색이있는 다른 레이아웃 위에 놓는 것도 작동하지 않습니다!
Zach

4
보기에 그려지는 잔물결의 색상은 무엇입니까? 예를 들어 colorControlHighlight는 어떤 색상으로 해석됩니까?
alanv 2014

답변:


260

레이아웃에 다음 속성을 설정합니다 (레이아웃에 기본 흰색 / 밝은 배경이있는 경우).

          android:clickable="true"
          android:focusable="true"
          android:background="?attr/selectableItemBackground"

이 경우 사용자 정의 드로어 블이 필요하지 않습니다.

그러나 레이아웃에 검은 색 / 어두운 배경이있는 경우 다음과 같이 고유 한 잔물결 드로어 블을 만들어야합니다.

<?xml version="1.0" encoding="utf-8"?>
<!-- An white rectangle ripple. -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@android:color/white">
    <item
        android:id="@android:id/mask"
        android:gravity="center">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white"/>
        </shape>
    </item>
</ripple>

그런 다음이 잔물결 드로어 블을 android : background 속성으로 설정합니다.

AOSP에서 이러한 유형의 잔물결에 대한 많은 예를 볼 수 있습니다. 여기에서


11
배경색을 다르게 지정해야한다면 어떨까요? 그렇다면 최선의 접근 방법은 무엇입니까?
Anuj Sharma

1
@AnujSharma 당신은 색상 자원을 제공하려고 했습니까 background?
IgorGanapolsky


31
다른 배경 색상을 원하는 경우에 당신은 배경으로 그 색상을 설정하고 안드로이드로 넣을 수 있습니다 : 대신 전경 "ATTR / selectableItemBackground?"를
루카스 Arrefelt에게

2
와! 이것은 훌륭합니다. 이것은 대답 +1로 표시한다
지 아우르 라흐만

59

나는 누군가가 다른 색상의 레이아웃을 원하고 파급 효과를 원할 경우 Igor Ganapolsky 의 대답에 추가하여 이것을 추가 하고 있습니다. 다음과 같이 드로어 블에 잔물결 효과를 만들기 만하면됩니다.

ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="@color/rippleColor"
    tools:targetApi="lollipop"> <!-- ripple effect color -->
    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <solid android:color="@color/backgroundColor" /> <!-- background color -->
        </shape>
    </item>
</ripple>

그런 다음 Igor Ganapolsky가 답변에서 언급 한 것처럼 레이아웃의 배경이나 버튼으로 제공하십시오 .

android:clickable="true"
android:background="@drawable/ripple"

37

모든 위젯 ( TextView/ Button) 에서 다음 코드 스 니펫을 변경해야하며 Ripple Effect를 구현할 수 있습니다 .

android:clickable="true"
android:focusable="true"
android:foreground="?attr/selectableItemBackground"

그리고 당신은 갈 수 있습니다.


흠 전경? 이것은 훌륭합니다!
Badr

이미 android : background = "@ color / colorAccent"세트가있는 경우 유용합니다
aero

@aero 배경을 설정하지 않아도 도움이됩니다.
Pankaj Lilan

1
이것은 위젯 외에도 레이아웃 및 사용자 정의보기에서 작동합니다.
anoo_radha

1
@MichaelKern 예, 맞습니다. 또한 코드에서 모든 사람의 요구 사항을 기반으로합니다.
Pankaj Lilan 2018

20

이것이 의도 한대로 작동하는 것으로 밝혀졌습니다. 표준 머티리얼 테마 colorControlHighlight 값은 #40ffffff입니다. 따라서 흰색 배경에는 표시되지 않습니다. 하이라이트 색상을 다른 것으로 변경하거나 개체의 배경색을 변경하면됩니다.

모두에게 감사합니다 (특히 올바른 방향을 알려준 Alanv).


내 뷰에서 android : background = "? attr / selectableItemBackground"를 사용하는 경우 개체의 배경을 어떻게 변경할 수 있습니까?
codeskraps

1
selectableItemBackground 기본 상태가 투명하다는 것을 알았습니다. 그래서 그 아래에 원하는 색상으로 뷰를 설정했습니다.
codeskraps

1
빠른 참고 : 사용자가 변경할 수있는 colorControlHighlight사용자에 styles.xml. 예를 들어 사용자 정의 테마에 추가하십시오.
Nuhman


5

다음은 잔물결 효과가있는 샘플 레이아웃을 클릭하는 예입니다.

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"
    android:orientation="vertical">

이것이 얼마나 단순한 지 그리고 이것이 단지 Just Works ™라는 단순한 사실은 매우 간단합니다.
Machado

4
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#cfd8dc"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#d1c4e9" />
        </shape>
    </item>
</ripple>

Drawable 폴더 에서이 ripple.xml을 사용한 다음 View의

android : background = "@ drawable / ripple"

android : clickable = "true"


2

기본 물결 효과를 추가하기 만하면 android:background="?selectableItemBackground"

처럼:

<LinearLayout
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="?selectableItemBackground"
            android:clickable="true"
            >

           ...

</LinearLayout>

0

이것을 레이아웃에 넣으십시오.

android:clickable="true"
android:background="?attr/selectableItemBackground"

참고 : API 문서에 버그가 있습니다. API> = 23 에서만 작동합니다.

대한 모든 API 레벨 이 사용 솔루션


2
귀하의 링크는이 같은 페이지 재
TSR

android : background = "? attr / selectableItemBackgroundBorderless"를 사용할 수있는 옵션도 있다는 것을 명심하십시오. 테두리가 적음으로써 파급 효과는 상위 뷰로 확장됩니다. 이것은 많은 경우에 더 좋아 보일 수 있습니다.
Michael Kern

0

나는 그 모든 대답을 시도했지만 아무것도 효과가 없었기 때문에 다음 스타일을 만드는 것을 해결했습니다.

<style name="Button.Borderless" parent="Base.Widget.AppCompat.Button.Borderless">
    <item name="android:minHeight">0dp</item>
    <item name="android:minWidth">0dp</item>
    <item name="android:layout_marginLeft">-6dp</item>
    <item name="android:layout_marginRight">-6dp</item>
    <item name="android:paddingTop">0dp</item>
    <item name="android:paddingBottom">0dp</item>
    <item name="android:paddingLeft">6dp</item>
    <item name="android:paddingRight">6dp</item>
</style>

그런 다음 선형 레이아웃에 적용했습니다.

<LinearLayout
      android:id="@+id/ll_my_ripple"
      style="@style/Button.Borderless">
</LinearLayout>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.