ボタンを作成し、そのボタンに波及効果を追加したいです。
ボタン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" />
しかし、波紋効果を追加した後、ボタンの背景は透明になり、ボタンがクリックされたときにのみ表示されます。
クリックする前に
クリックで
しかし、ボタンの背景色と波及効果の両方が必要です。スタックオーバーフローのさまざまなブログでこのコードの一部を見つけましたが、それでも機能しません。
グラデーションの背景、コーナーの半径、波紋効果をまとめて追加したい人のためのもう1つの描画可能な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" />
ビューの"?attr/selectableItemBackground"
とともに背景がすでにある場合は、Android:clickable="true"
をビューのforeground
属性に追加します。
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" />
Jigar Patelの解決策に加えて、これを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"
ボタンがドロウアブルからの背景を持っているとき、私たちは前景パラメータに波及効果を加えることができます。
<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/
あなたが
?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"
/>
前景とクリック可能な属性を追加するとうまくいきました。
<Button
...
Android:background="@color/your_color"
Android:foreground="?attr/selectableItemBackgroundBorderless"
Android:clickable="true" />
Android:backgroundを使用すると、ボタンのスタイルや外観の多くが空白の色に置き換えられます。
更新:AppCompatのバージョン23.0.0リリースの時点で、無効色にテーマのcolorButtonNormal、有効色にcolorAccentを使用する新しいWidget.AppCompat.Button.A色スタイルがあります。
これにより、ボタンを介してボタンに直接適用することができます。
<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>
これを試して
<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" />
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>
ただ使用してください:
Android:backgroundTint="#f816a463"
の代わりに:
Android:background="#f816a463"
Button
をAndroid.support.v7.widget.AppCompatButton
に変更することを忘れないでください
<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" />
<?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>