changjiashuai's blog

Runnig...

The future belongs to those who believe in the beauty of their dreams.


Android Drawable 如何添加一个自定义的按钮状态

增加状态的过程如下:

>定义状态数组
>重写protected int[] onCreateDrawableState(int extraSpace)
>调用refreshDrawableState() --> call drawableStateChanged()
>重写protected void drawableStateChanged()
  1. 定义属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="food">
        <attr name="state_fried" format="boolean" />
        <attr name="state_baked" format="boolean" />
    </declare-styleable>
</resources>
  1. 定义控件
public FoodButton(Context context, AttributeSet attrs) {
    super(context, attrs);
}

//定义状态数组
private static final int[] STATE_FRIED = {R.attr.state_fried};
private static final int[] STATE_BAKED = {R.attr.state_baked};

private boolean mIsFried = false;
private boolean mIsBaked = false;

public void setFried(boolean isFried) {mIsFried = isFried;}
public void setBaked(boolean isBaked) {mIsBaked = isBaked;}
Then override function "onCreateDrawableState":

//重写
@Override
protected int[] onCreateDrawableState(int extraSpace) {
    final int[] drawableState = super.onCreateDrawableState(extraSpace + 2);
    if (mIsFried) {
        mergeDrawableStates(drawableState, STATE_FRIED);
    }
    if (mIsBaked) {
        mergeDrawableStates(drawableState, STATE_BAKED);
    }
    return drawableState;
}
  1. 定义Drawable xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.mydomain.mypackage">
<item
    app:state_baked="true"
    app:state_fried="false"
    android:drawable="@drawable/item_baked" />
<item
    app:state_baked="false"
    app:state_fried="true"
    android:drawable="@drawable/item_fried" />
<item
    app:state_baked="true"
    app:state_fried="true"
    android:drawable="@drawable/item_overcooked" />
<item
    app:state_baked="false"
    app:state_fried="false"
    android:drawable="@drawable/item_raw" />
</selector>
最近的文章

app字体随系统字体变化问题

app字体不需要随系统字体的大小来改变,可以在activity基类加入下面代码:@Override public Resources getResources() { Resources res = super.getResources(); Configuration config = new Configuration(); config.setToDefaults(); res.updateConfiguration(conf...…

AndroidGradle Plugin继续阅读
更早的文章

Android Drawable

Android Drawable 思维导图DrawableDemo…

AndroidDrawable继续阅读