android 动态创建selector状态选择器 动态创建Drawable

最近在做一个使用接口返回的字符串:"#ff0000" 来动态设置drawable背景颜色与动态设置状态选择器selector的需求,之前写习惯了shape的xml,还是第一次写动态的,有点搞笑,搞笑的是自己没写过,不知道会不会写。

1.很简单,直接布局代码:

XML 复制代码
<RelativeLayout
        android:id="@+id/ll_title"
        android:layout_width="match_parent"
        android:layout_marginRight="20dp"
        android:layout_marginLeft="20dp"
        android:layout_height="50dp"
        app:contentInsetStart="0dp"
        android:background="@drawable/shape_red_bg"
        tools:ignore="MissingConstraints">

        <TextView
            android:id="@+id/toolbar_left"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:gravity="center"
            android:singleLine="true"
            android:text="菜单"
            android:textColor="@color/white"
            android:textSize="16dp"
            android:visibility="visible" />

        <TextView
            android:id="@+id/toolbar_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:singleLine="true"
            android:text="居中标题"
            android:layout_centerInParent="true"
            android:textColor="@android:color/white"
            android:textSize="20dp"
            android:visibility="visible" />

        <TextView
            android:id="@+id/toolbar_right"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_marginRight="10dp"
            android:gravity="center"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:text="秘密"
            android:textColor="@color/white"
            android:textSize="16dp"
            android:visibility="visible" />
    </RelativeLayout>
XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <!--    <size android:height="417dp" android:width="834dp"/>-->

    <gradient
        android:gradientRadius="417dp"
        android:startColor="@color/red"
        android:endColor="@color/red"
        android:centerX="0.5"
        android:centerY="1"
        android:type="radial" />

    <corners
        android:bottomLeftRadius="0dp"
        android:bottomRightRadius="0dp"
        android:topLeftRadius="0dp"
        android:topRightRadius="0dp" />
</shape>

2.Activity代码如下:

java 复制代码
//在Activity的初始化中直接复制下面代码:
RelativeLayout llTitle = findViewById(R.id.ll_title);
llTitle.setBackgroundDrawable(getStateListDrawable());
        llTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });


//在Activity中的方法
public static StateListDrawable getStateListDrawable() {
        StateListDrawable selector = new StateListDrawable();
        int parseColor = Color.parseColor("#FF00FF");
        Drawable pressDrawable = getRoundRectDrawable(20, Color.parseColor("#ff00ff"), true, 0);
        Drawable selectDrawable = getRoundRectDrawable(20, Color.parseColor("#00ffff"), true, 0);
        Drawable defaultDrawable = getRoundRectDrawable(20, Color.parseColor("#00ffff"), true, 0);

        selector.addState(new int[]{android.R.attr.state_pressed}, pressDrawable);
        selector.addState(new int[]{android.R.attr.state_selected}, selectDrawable);
        // 添加一个默认状态, 默认状态必须写在其他状态的最后面, 否则其他状态失效
        selector.addState(new int[]{}, defaultDrawable);

        return selector;
    }

    public static GradientDrawable getRoundRectDrawable(int radius, int color, boolean isFill, int strokeWidth){
        //左上、右上、右下、左下的圆角半径
        float[] radiusList = {radius, radius, radius, radius, radius, radius, radius, radius};
        GradientDrawable drawable = new GradientDrawable();
        drawable.setCornerRadii(radiusList);
        drawable.setColor(isFill ? color : Color.TRANSPARENT);
        drawable.setStroke(isFill ? 0 : strokeWidth, color);
        return drawable;
    }
java 复制代码
//补充设置渐变色
public static GradientDrawable getRoundRectDrawable(int radius, int color, boolean isFill, int strokeWidth){
        //左上、右上、右下、左下的圆角半径
        float[] radiusList = {radius, radius, radius, radius, radius, radius, radius, radius};
        GradientDrawable drawable = new GradientDrawable();
        //设置渐变色,渐变方向从左上到右下,渐变颜色设置
        GradientDrawable gradientDrawable = new GradientDrawable(GradientDrawable.Orientation.TL_BR,
                new int[]{R.color.blue_0B1152, R.color.blue_4E5988});
        drawable.setCornerRadii(radiusList);
        drawable.setColor(isFill ? color : Color.TRANSPARENT);
        drawable.setStroke(isFill ? 0 : strokeWidth, color);
        return drawable;
    }

亲测有效,写这篇文章只是想记录一下完整的实现代码。

相关博客推荐:

Android状态选择器selector的详细使用汇总

selector的两种设置方式

相关推荐
开开心心就好7 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
alexhilton9 小时前
藏在设备上的秘密,终究藏不住
android·kotlin·android jetpack
Setsuna_F_Seiei9 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
百万蹄蹄向前冲11 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙11 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan13 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen13 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理14 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒14 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche150015 小时前
利用 RAG 为答疑机器人扩展知识范围
前端