我有以下自定义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>
这种方法存在多个问题:
背景形状被涟漪完全覆盖,它们不再可见(无论是否经过检查)
背景形状应保持不变,我只想在点击按钮(选中或取消选中)时添加涟漪效果
涟漪效应的半径太大,它们相互重叠
纹波半径应与我的按钮半径相同。
我不知道如何做这项工作,非常感谢任何建议。
答案 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>