下边是drawable中各个标签对应的实现子类,想要在java代码中实现动态编写样式可以参考
xml标签 | Drawable实现子类 |
---|---|
<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 代码来实现动态替换选中的颜色怎么编写呢?
<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 是一个对勾图标,被加入了绘制的圆中。
各位能自己实现吗? 下边是 Java 版本的:
// 对应第一个 item
GradientDrawable notChecked = new GradientDrawable();//创建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));
// 对应第二个 item
GradientDrawable checked = new GradientDrawable();//创建drawable
checked.setColor(blue); // 设置自定义的颜色
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);
}
// 对应最外层 selector
stateListDrawable.addState(new int[]{-android.R.attr.state_checked}, notChecked);//-代表属性为false
stateListDrawable.addState(new int[]{android.R.attr.state_checked}, layerChecked);
Java 实现是比较麻烦的,尤其是设置 StateListDrawable 的各种状态,开始自己摸索一直没发现如何设置 false,在网上搜索后才发现只需要在属性前方加一个负号即可。
下方是 StateListDrawable 可支持的各种属性的值
属性值 | 含义 |
---|---|
android:state_active | 是否激活 |
android:state_checkable | 是否可勾选 |
android:state_checked | 是否已勾选 |
android:state_enabled | 是否可用 |
android:state_first | 是否处于开始状态 |
android:state_focused | 是否已获得焦点 |
android:state_last | 是否处于结束状态 |
android:state_middle | 是否处于中间状态 |
android:state_pressed | 是否按下 |
android:state_selected | 是否选中 |
android:state_window_focused | 是否窗口已获得焦点 |
希望可以帮助到有在 Java 代码中实现复杂样式的同学。
网友评论