Android编程:如何将Color转换为ColorStateList设置Shape描边颜色
如何将android.graphics.Color转换为ColorStateList用于GradientDrawable的描边
嘿,我懂你遇到的困扰了——其实如果你的描边只需要单一固定颜色,完全不用写那么复杂的状态数组,Android提供了更简洁的方式来生成单一颜色的ColorStateList。
直接用ColorStateList.valueOf()方法就可以搞定,它会生成一个所有状态下都使用同一颜色的ColorStateList,修改后的代码如下:
GradientDrawable shape = new GradientDrawable(); shape.setShape(GradientDrawable.RECTANGLE); // 直接将你的borderColor转换为ColorStateList shape.setStroke(3, ColorStateList.valueOf(borderColor));
至于你之前的写法未生效,大概率是状态数组的逻辑问题:你定义的状态覆盖了多个场景,但你的View可能没触发对应状态,或者状态匹配的优先级不对。如果确实需要根据不同View状态设置不同描边颜色,得保证状态数组和颜色数组的对应关系正确,还要注意状态的优先级顺序。比如正确的多状态写法示例:
// 状态数组:注意顺序,优先级从高到低排列 int[][] states = new int[][] { new int[] {android.R.attr.state_pressed}, // 按下状态(优先级最高) new int[] {android.R.attr.state_checked}, // 选中状态 new int[] {android.R.attr.state_enabled}, // 启用状态 new int[] {} // 默认状态(必须放在最后) }; // 对应每个状态的描边颜色 int[] colors = new int[] { Color.RED, // 按下时红色描边 Color.GREEN, // 选中时绿色描边 Color.BLUE, // 启用时蓝色描边 Color.GRAY // 默认灰色描边 }; ColorStateList myList = new ColorStateList(states, colors); shape.setStroke(3, myList);
这里要注意,Android会从状态数组的第一个条目开始匹配,找到第一个符合当前View状态的条目就会使用对应颜色,所以要把更具体的状态(比如pressed)放在前面,默认状态(空数组)必须放在最后。另外你之前代码里的Color.toARGB()是错误用法,应该直接传入具体的颜色值(比如你定义的borderColor或者Color.parseColor("#FF0000")这类写法)。
内容的提问来源于stack exchange,提问作者Santosh
相关产品推荐
相关产品推荐

