シンプルなレイアウトでリップル効果を作成する方法


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に感謝します。私の返答は以下を参照してください。基本的に、リップル効果を持たせたいレイアウトにクリック可能なマークを付けていますが、まだ機能しません。
ザック

また、<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

2
うわー!これは素晴らしい。これは回答+1としてマークする必要があります
Zia Ur Rahman

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>

次に、それをレイアウトの背景として、またはイゴール・ガナポルスキーが彼の回答で述べた任意のボタンとして与えます。

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

37

ウィジェット(TextView/ Button)で次のコードスニペットを変更する必要があり、リップル効果を実装できます。

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

そして、あなたは行ってもいいです。


うーん前景?これは素晴らしい!
Badr

これは、すでにandroid:background = "@ color / colorAccent"を設定している場合に役立ちます
aero

@aero背景を設定しなくても役に立ちます。
Pankaj Lilan 2018年

1
これは、ウィジェットに加えて、レイアウトとカスタムビューで機能します。
anoo_radha

1
@MichaelKernはい、そうです。また、それは彼らのコードにおける全員の要件に基づいています。
Pankaj Lilan 2018年

20

これは意図したとおりに機能していることがわかります。標準のマテリアルテーマcolorControlHighlight値は#40ffffffです。したがって、白い背景では、これは表示されません。ハイライト色を別の色に変更したり、オブジェクトの背景色を変更したりします。

すべてに感謝します(特に私を正しい方向に向けてくれたAlanv)。


ビューでandroid:background = "?attr / selectableItemBackground"を使用している場合、オブジェクトの背景を変更するにはどうすればよいですか?
codekraps、2015

1
selectableItemBackgroundのデフォルトの状態が透明であることを確認しました。それで、その下に希望の色でビューを設定しました。
コードスラップ2015

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™であるという単純な事実です。
マチャド

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を使用し、それをビューとして割り当て ます

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.