美文网首页Android进阶之路Android开发
Android Drawable对应关系和各个子类使用详解

Android Drawable对应关系和各个子类使用详解

作者: lebronzhen | 来源:发表于2022-04-21 17:26 被阅读0次

    下边是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 代码中实现复杂样式的同学。

    相关文章

      网友评论

        本文标题:Android Drawable对应关系和各个子类使用详解

        本文链接:https://www.haomeiwen.com/subject/guptdrtx.html