下邊是drawable中各個標(biāo)簽對應(yīng)的實(shí)現(xiàn)子類蛀骇,想要在java代碼中實(shí)現(xiàn)動態(tài)編寫樣式可以參考
xml標(biāo)簽 | Drawable實(shí)現(xiàn)子類 |
---|---|
<bitmap> | BitmapDrawable |
<nine-patch> | NinePatchDrawable |
<shape> | ShapeDrawable |
<layer-list> | LayerDrawable |
<selector > | StateListDrawable |
<level-list> | LevelListDrawable |
<transition> | TransitionDrawable |
<inset> | InsetDrawable |
<scale> | ScaleDrawable |
<clip> | ClipDrawable |
<color > | ColorDrawable |
<gradient > | GradientDrawable |
下邊xml是一個樣例,是checkBox的自定義的樣式蛹尝,順帶著幫助各位熟悉 Java Drawable 子類的使用镣奋,想要用 Java 代碼來實(shí)現(xiàn)動態(tài)替換選中的顏色怎么編寫呢币呵?
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false">
<shape android:shape="oval">
<size android:width="18dp" android:height="18dp" />
<solid android:color="@color/color_fff" />
<stroke android:width="0.5dp" android:color="@color/color_909399" />
</shape>
</item>
<item android:state_checked="true">
<layer-list>
<item android:width="18dp" android:height="18dp">
<shape android:shape="oval">
<solid android:color="@color/color_main" />
</shape>
</item>
<item android:width="10dp" android:height="10dp" android:drawable="@drawable/selected" android:gravity="center" />
</layer-list>
</item>
</selector>
注:@drawable/selected 是一個對勾圖標(biāo),被加入了繪制的圓中侨颈。
各位能自己實(shí)現(xiàn)嗎余赢? 下邊是 Java 版本的:
// 對應(yīng)第一個 item
GradientDrawable notChecked = new GradientDrawable();//創(chuàng)建drawable
notChecked.setColor(ContextCompat.getColor(context, R.color.color_fff));
notChecked.setShape(GradientDrawable.OVAL);
notChecked.setSize(DensityUtil.dp2px(context, 18), DensityUtil.dp2px(context, 18));
notChecked.setStroke(DensityUtil.dp2px(context, 0.5f), ContextCompat.getColor(context, R.color.color_909399));
// 對應(yīng)第二個 item
GradientDrawable checked = new GradientDrawable();//創(chuàng)建drawable
checked.setColor(blue); // 設(shè)置自定義的顏色
checked.setShape(GradientDrawable.OVAL);
checked.setSize(DensityUtil.dp2px(context, 18), DensityUtil.dp2px(context, 18));
BitmapDrawable bitmapDrawable = (BitmapDrawable) ContextCompat.getDrawable(context, R.drawable.selected);
StateListDrawable stateListDrawable = new StateListDrawable();
// layer-list
LayerDrawable layerChecked = new LayerDrawable(new Drawable[]{checked, bitmapDrawable});
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
layerChecked.setLayerSize(1, DensityUtil.dp2px(context, 10), DensityUtil.dp2px(context, 10));
layerChecked.setLayerGravity(1, Gravity.CENTER);
}
// 對應(yīng)最外層 selector
stateListDrawable.addState(new int[]{-android.R.attr.state_checked}, notChecked);//-代表屬性為false
stateListDrawable.addState(new int[]{android.R.attr.state_checked}, layerChecked);
Java 實(shí)現(xiàn)是比較麻煩的,尤其是設(shè)置 StateListDrawable 的各種狀態(tài)肛搬,開始自己摸索一直沒發(fā)現(xiàn)如何設(shè)置 false没佑,在網(wǎng)上搜索后才發(fā)現(xiàn)只需要在屬性前方加一個負(fù)號即可。
下方是 StateListDrawable 可支持的各種屬性的值
屬性值 | 含義 |
---|---|
android:state_active | 是否激活 |
android:state_checkable | 是否可勾選 |
android:state_checked | 是否已勾選 |
android:state_enabled | 是否可用 |
android:state_first | 是否處于開始狀態(tài) |
android:state_focused | 是否已獲得焦點(diǎn) |
android:state_last | 是否處于結(jié)束狀態(tài) |
android:state_middle | 是否處于中間狀態(tài) |
android:state_pressed | 是否按下 |
android:state_selected | 是否選中 |
android:state_window_focused | 是否窗口已獲得焦點(diǎn) |
希望可以幫助到有在 Java 代碼中實(shí)現(xiàn)復(fù)雜樣式的同學(xué)温赔。