ボタンをクリックしたときにボタンに円形の波紋を作る方法は?


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

質問

クリックしたときにボタンに円形の波紋効果を持たせるにはどうすればよいですか?新しいドローアブルを作成する必要がありますか、それとも組み込みの方法がありますか?


2

可能な答えはここにあるstackoverflow.com/questions/33477025/...
Amrish Kakadiya

1
実際に問題を解決するので、選択した回答を賛成票が最も多いものに変更することを検討してください
Jeff Barger

@JeffBargerなんで?どちらも正常に動作します。それらの間に良いものはありません。
Android開発者

回答:


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>

285

AppCompatテーマを使用している場合は、ビューの背景を次のように設定できます。

android:background="?selectableItemBackgroundBorderless"

これにより、21以上に円形の波紋が、21以下に正方形の背景が追加されます。


いいね。どういうわけか色も設定できますか?
Android開発者

4
API 23では、「上」の背景はselectbleItemBackgroundBorderlessに比べて半分のサイズに見えます
snodnipper

3
いい答えです。ty
スカイウォーカー

1
@androiddeveloper、色は、styles.xmlで以下のようにcolorControlHighlightを設定することで設定できます<item name = "colorControlHighlight">#F00 </ item>
ボンド

3
他のレイアウト内で使用している場合はandroid:clipChildren="false"、アニメーションを伝播させるためにレイアウトでも必要になる場合があります。
Tanasis

82

特にアクションバー用の、波紋効果のある別の属性:

android:background="?actionBarItemBackground"

UPD:波紋の色は、この属性によって変更できます。

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

ただし、この属性はすべてのデフォルトの波及効果に適用されることに注意してください。


それをカスタマイズする方法はありますか?例えば色?多分スタイルで何か?または、ビューXMLタグ自体でさらに具体的には?
Android開発者

わからない、今日私はこの問題を解決し、上記の答えは私が必要なように機能しませんでした。色はスタイルでカスタマイズできると思いますが、ビューでは絶対にできません。
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.

ロリポップ前の場合、デフォルトのセレクターをどのように使用しますか?また、ダイヤラと同じ色を使用していますか?
Android開発者

2
drawables-v21フォルダーにリップルドローアブルを配置できます。プレLには、単純な状態のドローアブルを使用します。同じファイル名を使用して、それをドローアブル(デフォルト)フォルダーに配置します。
トーマスR.

2
スタイルを作成することもできます。values-v21フォルダで、新しいスタイルを作成し、リップルドローアブルを背景として設定します。そして、Lより前の場合、つまり、値フォルダーstyles.xmlに、同じスタイルの「selectableItemBackground」属性を背景として配置します。
トーマスR.

1
アプリで使用される他のデフォルトの波紋効果と同じ波紋色が必要な場合は、色として「?attr / colorControlHighlight」を使用します。
alexbchr 2017


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_radius30dp(幅/ 2または高さ/ 2)に近いはずです。

Android 5.0以降で動作します。


3

より一般的なXMLファイルが必要な場合は、2つのファイルがあります。

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 not found
Rahul Mandaliya

@RahulMandaliyaコメントありがとうございます。私の悪いことに、それは私のカスタム拡張メソッドでした。回答に追加
mihails.kuzmins
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.