下边是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 版本的:
GradientDrawable notChecked = new GradientDrawable();
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));
GradientDrawable checked = new GradientDrawable();
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();
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);
}
stateListDrawable.addState(new int[]{-android.R.attr.state_checked}, notChecked);
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 代码中实现复杂样式的同学。
|