在Android SDK的\samples\android-21\ui\views\FloatingActionButton样例中,按钮未选中的状态
单机按钮后,如下图:
这里的FloatingActionButton是自定义的FrameLayout
public class FloatingActionButton extends FrameLayout implements Checkable
在配置文件中指定它的背景是通过selector设置的
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<ripple android:color="@color/fab_color_2_muted">
<item>
<shape>
<solid android:color="@color/fab_color_2" />
</shape>
</item>
</ripple>
</item>
<item>
<ripple android:color="@color/fab_color_1_muted">
<item>
<shape>
<solid android:color="@color/fab_color_1" />
</shape>
</item>
</ripple>
</item>
</selector>
但是在FloatingActionButton 的定义中,需要复写onCreateDrawableState方法
@Override
protected int[] onCreateDrawableState(int extraSpace) {
Log.d(TAG,"onCreateDrawableState");
Log.d(TAG,"extraSpace="+extraSpace);
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}
return drawableState;
}
而且FloatingActionButton 的点击响应是
@Override
public boolean performClick() {
Log.d(TAG,"performClick");
toggle();
return super.performClick();
}
这里的toggle是复写view的方法,实现状态转变
@Override
public void toggle() {
setChecked(!mChecked);
}
在setChecked方法中,实现点击的回调等事件
/**
* Sets the checked/unchecked state of the FAB.
* @param checked
*/
public void setChecked(boolean checked) {
// If trying to set the current state, ignore.
if (checked == mChecked) {
return;
}
mChecked = checked;
// Now refresh the drawable state (so the icon changes)
refreshDrawableState();
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(this, checked);
}
}