向自定义CompoundButton添加涟漪效果

时间:2017-06-28 12:59:12

标签: android android-layout android-drawable

我有以下自定义CompoundButton

public class CustomCompoundButton extends CompoundButton {

    public CustomCompoundButton(Context context) {
        this(context, null);
    }

    public CustomCompoundButton(Context context, AttributeSet attrSet) {
        super(context, attrSet);
        setup();
    }

    private void setup() {
        setBackgroundResource(R.drawable.button_selector);
        setGravity(Gravity.CENTER);
        setClickable(true);
    }
}

在将其添加到布局后,我从代码中设置了Button的宽度和高度:

button.getLayoutParams().width = myWidth;
button.getLayoutParams().height = myHeight;

button_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/button_checked"
        android:state_checked="true" />
    <item
        android:drawable="@drawable/button_unchecked"
        android:state_checked="false" />
</selector>

button_checked.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="?colorAccent" />
</shape>

button_unchecked.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <stroke
        android:width="2dp"
        android:color="?colorAccent" />
</shape>

这可以按预期工作,Button在未选中时为空圆圈,在选中时为圆圈。

问题是我无法在此行为的基础上添加涟漪效应。

我尝试将selector包裹在ripple标签中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#ffffff">
    <selector>
        <item
            android:drawable="@drawable/button_checked"
            android:state_checked="true" />
        <item
            android:drawable="@drawable/button_unchecked"
            android:state_checked="false" />
    </selector>
</ripple>

这种方法存在多个问题:

  • 背景形状被涟漪完全覆盖,它们不再可见(无论是否经过检查)

    背景形状应保持不变,我只想在点击按钮(选中或取消选中)时添加涟漪效果

  • 涟漪效应的半径太大,它们相互重叠

    纹波半径应与我的按钮半径相同。

我不知道如何做这项工作,非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

shape中的每个ripple包裹起来而不是将整个selector包裹在ripple中会产生预期的效果。

有关示例,请参阅this comment

因此,button_unchecked.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="#ffffff"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="oval">
            <stroke
                android:width="2dp"
                android:color="?colorAccent" />
        </shape>
    </item>
    <item
        android:id="@android:id/background"
        android:drawable="?colorAccent" />
</ripple>