ボタンの背景色でボタンにリップル効果を追加しますか?


125

ボタンを作成し、そのボタンに波及効果を追加したいと思います!

ボタンbg XMLファイルを作成しました:(bg_btn.xml)

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:startColor="#FFFFFF" android:endColor="#00FF00" android:angle="270" />
<corners android:radius="3dp" />
<stroke android:width="5px" android:color="#000000" />
</shape>

そして、これは私の波及効果ファイルです:(ripple_bg.xml)

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#f816a463"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#f816a463" />
        </shape>
    </item>
</ripple>

そして、これは私が波及効果を追加したい私のボタンです:

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_centerHorizontal="true"
android:layout_marginTop="173dp"
android:textColor="#fff"
android:background="@drawable/ripple_bg"
android:clickable="true" />

しかし、リップル効果を追加した後、ボタンの背景は透明になり、ボタンはクリックされたときのみ次のように表示されます。

クリックする前

クリック時

しかし、ボタンの背景色と波及効果の両方が必要です。このコードの一部をスタックオーバーフローの別のブログで見つけましたが、それでも機能しません。


次回はスクリーンショットをもっと小さくしてください..(アップロード前にサイズ変更)
user25

@ user25、lまたはm画像リンクにor を追加することもできます。(私の編集を参照)
Suragch 2018

回答:


154

以下は、グラデーションの背景、角の半径、波紋効果をすべて一緒に追加したい人のための別の描画可能なxmlです。

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/colorPrimaryDark">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimaryDark" />
            <corners android:radius="@dimen/button_radius_large" />
        </shape>
    </item>

    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <gradient
                android:angle="90"
                android:endColor="@color/colorPrimaryLight"
                android:startColor="@color/colorPrimary"
                android:type="linear" />
            <corners android:radius="@dimen/button_radius_large" />
        </shape>
    </item>
</ripple>

これをボタンの背景に追加します。

<Button
    ...
    android:background="@drawable/button_background" />

4
@peiどうやってこの情報を入手するの?つまり、この作業を行うためにリップルというXML要素があることをどのようにして知っているのでしょうか。

1
マテリアルデザインで使用されるコンセプトの1つです。Android Studioのドローアブルxmlに新しいルートタグの入力を開始すると、を含む使用可能なすべてのタグが表示されますripple
ペイ

1
マスクアイテムの用途は何ですか?
Prashant 2018

10
これにはAPIレベル21が必要です
M.kazem Akhgary 2018年

2
動作しますが、動作方法は説明されていません。アイテムのIDと関連付ける必要があります。参照する必要があります。
oiyio

155

に背景がすでにある場合は"?attr/selectableItemBackground"、ビューのandroid:foreground属性にを追加しますandroid:clickable="true"


常に機能するとは限りませんが、受け入れられた回答のコメントに記載されているように、波及効果に背景を追加できます
Tyler

ボタンにカスタム背景を使用したため、このソリューションを使用する必要がありました。それはうまくいきました。
bnayagrawal 2018

@ROAR、それは正しいですが、少なくとも:「これはエラーではありません。アプリケーションは属性を単に無視します。ただし、属性がアプリケーションの外観または機能にとって重要である場合、達成するための代替方法を見つけることを検討する必要があります。使用可能な属性のみで同じ結果が得られます。次に、オプションで、レイアウトのコピーをlayout-vNNフォルダーに作成し、新しい属性を利用できるAPI NN以降で使用できます。」そのため、API 23以上のデバイスでうまく機能し、以下の場合は無視されます(単にできるtools:ignore="UnusedAttribute)。
JorgeAmVF

Androidサポートライブラリがなければ、次のようになります?android:attr/selectableItemBackgroundandroid:attr代わりにattr
週末

1
android:foreground属性は、23未満のAPIレベルには影響しません
Vadim Kotov

67

Androidボタンにリップルエフェクト/アニメーションを追加する

ボタンの背景属性をandroid:background = "?attr / selectableItemBackground"に置き換えるだけで、コードは次のようになります。

      <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/selectableItemBackground"
        android:text="New Button" />

Androidボタンに波紋効果/アニメーションを追加する別の方法

この方法を使用すると、リップル効果の色をカスタマイズできます。まず、ドローアブルリソースディレクトリにxmlファイルを作成する必要があります。ripple_effect.xmlファイルを作成し、次のコードを追加します。 res / drawable / ripple_effect.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="#f816a463"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#f816a463" />
        </shape>
    </item>
</ripple>

ボタンの背景を上記のドローアブルリソースファイルに設定します

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/ripple_effect"
    android:padding="16dp"
    android:text="New Button" />

1
私にとって、波及効果は現れませんでした。それはボタンのカラースイッチにすぎませんでした:/私のAndroidバージョンは5.1.1なので、動作するはずです。手伝ってくれる?私はあなたのステップに従っ
UrviG

android:colorはマストandroid:colorとは異なる必要があります。そうしないと、波及効果が見られます
SpyZip

2
背景が必要な場合は、次のようにリップルに別のアイテムを追加します。<item android:drawable = "?attr / colorPrimary" />
Tyler

36

加えて、Jigarパテルの溶液にこれを追加しripple.xmlボタンの透明な背景を避けるために。

<item
    android:id="@android:id/background"
    android:drawable="@color/your-color" />

完全なxml

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="@color/your-color"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="@color/your-color" />
        </shape>
    </item>
    <item
        android:id="@android:id/background"
        android:drawable="@color/your-color" />
</ripple>

ボタンの背景として、このripple.xmlを使用します。

android:background="@drawable/ripple"

2
を使用する必要はありませんでした<item android:id="@android:id/mask"> [...]。楕円形のマスクが必要な場合を除きます。ご回答有難うございます!
Filipe Brito

とにかく、この<item android:id = "@ android:id / mask">は何をしますか、その属性の有無にかかわらず2つの同様の要素を作成しましたが、それらはまったく同じに見えます
Sartheris Stormhammer

公式ドキュメントの@SartherisStormhammer:マスクレイヤーが設定されている場合、リップル効果は残りの子レイヤーの合成の上に描画される前にそのレイヤーに対してマスクされます。マスクレイヤーが設定されていない場合、リップル効果は子レイヤーの合成に対してマスクされます。これはリンクです、developer.android.com
reference / android / graphics / drawable /…

@SudheeshRが混乱を招く
Sartheris Stormhammer 2017年

@SartherisStormhammerその公式ドキュメントからそれは私が思うにはかなり明確です。波紋効果は、子/マスクされたレイヤーの上に描画されます。もう一度ドキュメントを読んでください。要点がわかります。
Sudheesh R 2017

33

ボタンにドローアブルの背景がある場合、前景パラメーターにリップル効果を追加できます。以下のコードを確認して、異なる背景を持つボタンの動作を確認してください

    <Button
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:gravity="center"
    android:layout_centerHorizontal="true"                                                             
    android:background="@drawable/shape_login_button"
    android:foreground="?attr/selectableItemBackgroundBorderless"
    android:clickable="true"
    android:text="@string/action_button_login"
     />

波及効果のために以下のパラメータを追加します

   android:foreground="?attr/selectableItemBackgroundBorderless"
   android:clickable="true"

以下のリンクを参照してください https://jascode.wordpress.com/2017/11/11/how-to-add-ripple-effect-to-an-android-app/


2
属性android:foregroundは、23未満のAPIレベルには影響しません
Ali Khaki

このアプローチの欠点の1つは、ボタンの背景が楕円形であったとしても、波紋が長方形のエッジまで伝播していたことです。
iCantC

14

AppCompat v7 +

プレフィックスを付けないと?android:、アプリがクラッシュします。

好みに応じて、"?android:attr/selectableItemBackground"またはを使用する必要"?android:attr/selectableItemBackgroundBorderless"があります。私は好むBorderless

あなたはどちらかにそれを置くことができるandroid:backgroundか、android:foreground既存のプロパティを維持します。

これが機能するにはandroid:clickable="true"、要素にとが必要ですが、android:focusable="true"ボタンなどの多くの要素には、trueデフォルトでそれらが含まれています。

<Button
    ...
    android:background="@color/white"
    android:foreground="?android:attr/selectableItemBackgroundBorderless"
/>
<TextView
    ...
    android:background="?android:attr/selectableItemBackgroundBorderless"
    android:clickable="true"
    android:focusable="true"
/>

プログラムで(Java)

TypedValue value = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, value, true);
myView.setBackgroundResource(value.resourceId);
myView.setFocusable(true); // If needed for view type

プログラム的に(Kotlin)

val value = TypedValue()
context.theme.resolveAttribute(android.R.attr.selectableItemBackground, value, true)
myView.setBackgroundResource(value.resourceId)
myView.setFocusable(true) // If needed for view type

再利用可能なKotlin拡張関数

myView.ripple()

fun View.ripple(): View {
    val value = TypedValue()
    context.theme.resolveAttribute(android.R.attr.selectableItemBackground, value, true)
    setBackgroundResource(value.resourceId)
    isFocusable = true // Required for some view types
    return this
}

7

前景とクリック可能な属性を追加するとうまくいきました。

<Button
    ... 
    android:background="@color/your_color"
    android:foreground="?attr/selectableItemBackgroundBorderless"
    android:clickable="true" />

6

Sudheesh Rに加えて

角のあるボタン長方形の形状を持つAndroidボタンに波紋効果/アニメーションを追加する

XMLファイルres / drawable / your_file_name.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/colorWhite"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimaryDark" />
            <corners android:radius="50dp" />
        </shape>
    </item>

    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <gradient
                android:angle="90"
                android:endColor="@color/colorAccent"
                android:startColor="@color/colorPrimary"
                android:type="linear" />
            <corners android:radius="50dp" />
        </shape>
    </item>
</ripple>

4

android:backgroundを使用すると、ボタンのスタイリングとルックアンドフィールの多くが空白の色に置き換わります。

更新:AppCompatのバージョン23.0.0リリース以降、新しいWidget.AppCompat.Button.Aの色付きスタイルがあり、無効な色にはテーマのcolorButtonNormal、有効な色にはcolorAccentを使用します。

これにより、ボタンに直接適用できます

<Button
 ...
style="@style/Widget.AppCompat.Button.Colored" />

次のような背景には、v21ディレクトリのドローアブルを使用できます。

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

これにより、背景色が?attr / colorPrimaryになり、デフォルトの?attr / colorControlHighlight(必要に応じてテーマに設定することもできます)を使用したデフォルトのリップルアニメーションが設定されます。

注:v21未満のカスタムセレクターを作成する必要があります。

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

imがminSDKレベル21を使用
rakcode

v21ドローアブルフォルダーはなく、そのフォルダー自体が1つのフォルダーのみv21フォルダー
rakcode

はい、このAPIも使用しました。アプリをクリックした後にこのAPIを使用すると、クラッシュします
rakcode

実際、デバッグモードで携帯電話でアプリをテストしています。私のOSはCyanogenMod13(Android 6、Marshmellow)です
rakcode

4

これを試して

<Button
            android:id="@+id/btn_location"
            android:layout_width="121dp"
            android:layout_height="38dp"
            android:layout_gravity="center"
            android:layout_marginBottom="24dp"
            android:layout_marginTop="24dp"
            android:foreground="?attr/selectableItemBackgroundBorderless"
            android:clickable="true"
            android:background="@drawable/btn_corner"
            android:gravity="center_vertical|center_horizontal"
            android:paddingLeft="13dp"
            android:paddingRight="13dp"
            android:text="Save"
            android:textColor="@color/color_white" />

4

簡単な方法は、ここで概説するようにビューのテーマを設定することです

some_view.xml

<ImageView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="?attr/selectableItemBackgroundBorderless"
   android:focusable="true"
   android:src="@drawable/up_arrow"
   android:theme="@style/SomeButtonTheme"/>

some_style.xml

<style name="SomeButtonTheme" >
   <item name="colorControlHighlight">@color/someColor</item>
</style>

3

ただ使う:

android:backgroundTint="#f816a463"

の代わりに:

android:background="#f816a463"

に変更するButtonことを忘れないでくださいandroid.support.v7.widget.AppCompatButton


1
悪い点は、水平画面を100%埋めるためのボタンが必要な場合は必要ないということです。
Filipe Brito

1

を使用する代替ソリューション <ripple>タグ(色が「デフォルト」ではないため、個人的ない方がよい)は次のとおりです。

ボタンの背景にドローアブルを作成<item android:drawable="?attr/selectableItemBackground">し、<layer-list>

次に(これは重要な部分だと思います)、プログラムでbackgroundResource(R.drawable.custom_button)ボタンのインスタンスを設定します。

アクティビティ/フラグメント

Button btn_temp = view.findViewById(R.id.btn_temp);
btn_temp.setBackgroundResource(R.drawable.custom_button);

レイアウト

<Button
    android:id="@+id/btn_temp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/custom_button"
    android:text="Test" />

custom_button.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white" />
            <corners android:radius="10dp" />
        </shape>
    </item>
    <item android:drawable="?attr/selectableItemBackground" />
</layer-list>

なぜレイアウトXMLはボタンの背景を定義しているのに、プログラムですべてのbackgroundResourceを再度設定する必要があるのですか?
SunnyShiny9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.