34

リップルには次のコードがあります。

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

        <shape android:shape="oval">
            <solid android:color="?android:colorAccent"/>
        </shape>
    </item>
</ripple>

ここで、ユーザーが独自の色を選択できるようにしたいので、プログラムでリップルを作成する必要があります。これ
を見つけて、これが正しい方法だと思いますが、これを処理する方法がわかりません。

波紋はここで使用されます。

<ImageButton
    android:id="@+id/add_button"
    android:layout_width="@dimen/diameter"
    android:layout_height="@dimen/diameter"
    android:layout_gravity="end|bottom"
    android:layout_marginBottom="@dimen/add_button_margin"
    android:layout_marginEnd="@dimen/add_button_margin"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true"
    android:src="@drawable/ic_action_add_person"
    android:tint="@android:color/white"
    android:background="@drawable/oval_ripple"
    android:elevation="@dimen/elevation_low"
    android:stateListAnimator="@anim/button_elevation"
    android:contentDescription="Neuer Spieler" />

背景を次のRippleDrawableように設定する必要があります。

addButton.setBackground(ripple);
4

4 に答える 4

66

これが私がこれを達成することができた方法です。

これは Api 21+ のみであるため、下位バージョンをサポートする場合は通常の Drawable にフォールバックする必要があることに注意してください。

public static RippleDrawable getPressedColorRippleDrawable(int normalColor, int pressedColor)
{
    return new RippleDrawable(getPressedColorSelector(normalColor, pressedColor), getColorDrawableFromColor(normalColor), null);
}

public static ColorStateList getPressedColorSelector(int normalColor, int pressedColor)
{
    return new ColorStateList(
        new int[][]
            {
                new int[]{android.R.attr.state_pressed},
                new int[]{android.R.attr.state_focused},
                new int[]{android.R.attr.state_activated},
                new int[]{}
            },
        new int[]
            {
                pressedColor,
                pressedColor,
                pressedColor,
                normalColor
            }
    );
}

public static ColorDrawable getColorDrawableFromColor(int color)
{
    return new ColorDrawable(color);
}

編集: これをもう少しいじって、ColorStateListが上記のソリューションほど複雑である必要がないことを発見しました。以下のスニペットに簡略化しました。(上記のコード ブロックの他の部分はすべて同じです。ColorStateList の作成を変更しただけです。) この方法がうまくいかない場合に備えて、上記のブロックは元のままにします。

new ColorStateList(
    new int[][]
        {
            new int[]{}
        },
    new int[]
        {
            pressedColor
        }
);
于 2015-02-05T20:59:29.050 に答える
25
public static Drawable getAdaptiveRippleDrawable(
    int normalColor, int pressedColor) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        return new RippleDrawable(ColorStateList.valueOf(pressedColor),
                null, getRippleMask(normalColor));
    } else {
        return getStateListDrawable(normalColor, pressedColor);
    }
}

private static Drawable getRippleMask(int color) {
    float[] outerRadii = new float[8];
    // 3 is radius of final ripple, 
    // instead of 3 you can give required final radius
    Arrays.fill(outerRadii, 3);

    RoundRectShape r = new RoundRectShape(outerRadii, null, null);
    ShapeDrawable shapeDrawable = new ShapeDrawable(r);
    shapeDrawable.getPaint().setColor(color);
    return shapeDrawable;
}

public static StateListDrawable getStateListDrawable(
    int normalColor, int pressedColor) {
    StateListDrawable states = new StateListDrawable();
    states.addState(new int[]{android.R.attr.state_pressed}, 
        new ColorDrawable(pressedColor));
    states.addState(new int[]{android.R.attr.state_focused}, 
        new ColorDrawable(pressedColor));
    states.addState(new int[]{android.R.attr.state_activated}, 
        new ColorDrawable(pressedColor));
    states.addState(new int[]{}, 
        new ColorDrawable(normalColor));
    return states;
}

ドローアブルを取得し、 を使用して任意のビューに適用できますview.setDrawable
Lollipop+ デバイスの場合、波紋が発生します。それ以外の場合は、ビューの色が変わります。

于 2015-09-19T07:03:29.347 に答える
2

基本的に、新しい RippleDrawable オブジェクトを作成する必要があります。Lollipop 以前のデバイスの場合は、StateListDrawable が必要です (他の人が既に示唆しているように)。Drawables とカラーリングに関連する便利なメソッドをまとめた GIST を作成しました

#getBackgroundDrawable()ほとんどの場合、そのシングルトンから使用したいと思うでしょう。

于 2015-12-05T23:42:59.543 に答える