Android中动态的更改selector中某张图片的属性

在我们平常开发的时候会有许多状态按钮,比如state_pressed,android:state_checked,或者就正常状态等等,我们做这样的效果通常需要三个文件,一张是按下的图片,一张是正常状态的图片,一张是管理它们的selector文件,如果在不断更新迭代的过程中出现了很多这样的按钮,而且它们的颜色什么的都不一样,那我们的res/drawable文件夹下就会出现很多个这样的组合文件,导致我们的程序越来越大、越来越大,这肯定不是我们想看到的。


那么,我现在要拿出什么来解决这个问题呢?就是动态的更改它们的属性,把所有的工作都放在代码里面,减少selector.xml文件的产生:

我们在写属性的时候尽量要使用这样的方式(如果美工给了图的话,尽量让提供颜色值就可以了,不要做那么多图):

<span style="font-size:12px;"><?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><corners android:radius="5dp" /><solid android:color="#78909c" /></shape></item><item><shape><corners android:radius="5dp" /><solid android:color="#607d8b" /></shape></item></selector></span>

布局文件:

<span style="font-size:12px;"><?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent" ><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="Hello"android:textColor="#fff" /></FrameLayout></span>

这个xml文件的正常显示效果是:


效果还是挺不错的,接下来我们要动态改变它的效果,怎么做呢:

<span style="font-size:12px;">package com.sahadev.activitythemetest;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable.ConstantState;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.StateListDrawable;
import android.os.Bundle;
import android.widget.Button;public class MainActivity2 extends Activity { // Hold a reference to the current@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_zoom);Button button = (Button) findViewById(R.id.button);Drawable backgroundDrawable = getResources().getDrawable(R.drawable.xml_background);button.setBackground(backgroundDrawable);StateListDrawable sld = (StateListDrawable) backgroundDrawable;// 通过向下转型,转回原型,selector对应的Java类为:StateListDrawableConstantState cs = sld.getConstantState();try {Method method = cs.getClass().getMethod("getChildren", null);// 通过反射调用getChildren方法获取xml文件中写的drawable数组method.setAccessible(true);Object obj = method.invoke(cs, null);Drawable[] drawables = (Drawable[]) obj;for (int i = 0; i < drawables.length; i++) {// 接下来我们要通过遍历的方式对每个drawable对象进行修改颜色值GradientDrawable gd = (GradientDrawable) drawables[i];if (gd == null) {break;}if (i == 0) {// 我们对按下的状态做浅色处理gd.setColor(Color.rgb(155, 155, 155));} else {// 对默认状态做深色处理gd.setColor(Color.rgb(75, 75, 75));}}// 最后总结一下,为了实现这个效果,刚开始并没有看到setColor的方法,而是通过反射获取GradientDrawable对象的属性GradientState,// 再通过反射调用GradientState对象的setSolidColor方法去实现,效果不太理想。// 最后在仔仔细细一一看GradientDrawable对象的属性,发现属性Paint// mFillPaint,从名字就可以看出这个对象是用来绘制drawable的背景的,// 于是顺着往下找,发现setColor方法,于是bingo,这个过程也是挺曲折的。} catch (NoSuchMethodException e1) {e1.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}
</span>
方法就是这样,我们再来看看最后的实现效果:



怎么样,效果实现了我们需要的。

最后,贴上一个抽取出来的工具类:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable.ConstantState;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.StateListDrawable;public class SelectorUtils {/*** 动态修改selector中图片的背景颜色* * @param drawable*            selectorDrawable* @param rgbColors*            默认以及按下状态的颜色值*/public static void changeViewColor(StateListDrawable drawable, int[] rgbColors) {ConstantState cs = drawable.getConstantState();if (rgbColors.length < 2) {return;}try {Method method = cs.getClass().getMethod("getChildren", null);// 通过反射调用getChildren方法获取xml文件中写的drawable数组method.setAccessible(true);Object obj = method.invoke(cs, null);Drawable[] drawables = (Drawable[]) obj;for (int i = 0; i < drawables.length; i++) {// 接下来我们要通过遍历的方式对每个drawable对象进行修改颜色值GradientDrawable gd = (GradientDrawable) drawables[i];if (gd == null) {break;}if (i == 0) {// 我们对按下的状态做浅色处理gd.setColor(rgbColors[0]);} else {// 对默认状态做深色处理gd.setColor(rgbColors[1]);}}// 最后总结一下,为了实现这个效果,刚开始并没有看到setColor的方法,而是通过反射获取GradientDrawable对象的属性GradientState,// 再通过反射调用GradientState对象的setSolidColor方法去实现,效果不太理想。// 最后在仔仔细细一一看GradientDrawable对象的属性,发现属性Paint// mFillPaint,从名字就可以看出这个对象是用来绘制drawable的背景的,// 于是顺着往下找,发现setColor方法,于是bingo,这个过程也是挺曲折的。} catch (NoSuchMethodException e1) {e1.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}
}

有疑问欢迎留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 17. 电话号码的字母组合(回溯)

文章目录1. 题目信息2. 解题1. 题目信息 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例:输入&#xff1a;"23" 输出&#xff1a;[&…

细数一行代码改变结局的炼丹骚操作

文 | 陀飞轮&圈圈&年年的铲屎官源 | 知乎tips总结知乎答主&#xff1a;陀飞轮谈一下自己知道的。尽量避开优化器、激活函数、数据增强等改进。。先上完整列表&#xff1a;Deep Learning: Cyclic LR、FloodingImage classification: ResNet、GN、Label Smoothing、Shuff…

推荐收藏 | 美团技术团队的书单

4月23日对于世界文学而言是一个具有象征性意义的日子。1616年的这一天&#xff0c;塞万提斯、莎士比亚、印卡加西拉索德拉维加几位大师相继与世长辞。此外&#xff0c;这一天也是其他一些著名作家的出生和去世的日期&#xff0c;例如&#xff1a;莫里斯德吕翁、哈尔多尔K拉克斯…

论文浅尝 | 采用多层注意力机制的事件检测

笔记整理&#xff1a;杨帆&#xff0c;浙江大学计算机学院硕士&#xff0c;研究方向知识图谱。动机事件编码&#xff08;event encoding&#xff09;之前的工作集中在提取实体&#xff0c;检测触发单词以及匹配预定义的模板&#xff0c;这些方法存在以下缺点&#xff1a;首先它…

无需人工!无需训练!构建知识图谱 BERT一下就行了!

文&#xff1a;Sherry今天给大家带来的是一篇号称可以自动建立知识图谱的文章《Language Models are Open Knowledge Graphs》&#xff0c;文中提出了一个叫Match and Map&#xff08;MAMA&#xff09;的模型&#xff0c;无需人工&#xff01;无需训练&#xff01;只需语料和预…

LeetCode 557. 反转字符串中的单词 III(栈)

文章目录1. 题目信息2. 解题2.1 栈2.2 STL reverse()1. 题目信息 给定一个字符串&#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1:输入: "Lets take LeetCode contest" 输出: "steL ekat edoCteeL tse…

美团OCTO万亿级数据中心计算引擎技术解析

美团点评自研的 OCTO 数据中心&#xff08;简称 Watt&#xff09;日均处理万亿级数据量&#xff0c;该系统具备较好的扩展能力及实时性&#xff0c;千台实例集群周运维成本低于10分钟。本文将详细阐述 Watt 计算引擎的演进历程及架构设计&#xff0c;同时详细介绍其全面提升计算…

中文实体命名识别工具使用汇总:Stanza、LAC、Ltp、Hanlp、foolnltk、NLTK、BosonNLP

实体命名识别相关知识Stanford CoreNLP 命名实体识别一、简介&#xff1a;二、java版本使用三、python版本使用NLTK 命名实体识别一、简介&#xff1a;二、搭建环境三、nltk使用1、英文实体命名初体验2、使用nltk来处理中文资料结巴分词使用foolnltk 命名实体识别一、简介二、p…

论文浅尝 | 基于知识图谱中图卷积神经网络的推荐系统

笔记整理&#xff1a;王若旭&#xff0c;浙江大学在读硕士&#xff0c;研究方向为关系抽取&#xff0c;零样本学习。本文发表于 www2019&#xff0c;参考链接&#xff1a;https://arxiv.org/pdf/1905.04413.pdf为了解决推荐系统中协同过滤方法面对的数据稀疏和冷启动的问题&…

NeurIPS 2020 | Glance and Focus: 通用、高效的神经网络自适应推理框架

文 | rainforest wang源 | 知乎本文主要介绍我们被NeurIPS 2020会议录用的一篇文章&#xff1a;Glance and Focus: a Dynamic Approach to Reducing Spatial Redundancy in Image Classification代码和预训练模型已经在Github上面放出&#xff1a;https://link.zhihu.com/?tar…

如何下载Android源码(非常详细,含自动恢复下载,编译,运行模拟器说明)

今天终于把代码下载完成&#xff0c;特此开一篇博文记录一下。上图&#xff1a; 为了下载这些源码&#xff0c;历时5天5夜&#xff0c;说为什么这么长时间&#xff0c;是因为太容易中断了&#xff0c;有时候下一晚上可能就一直没在下&#xff0c;在你入睡的时候它就自己断了&am…

NumPy快速入门-- Less 基础/线性代数

文章目录1. 广播&#xff08;Broadcasting&#xff09;规则2. 使用索引数组索引3. 使用布尔值作为数组索引4. ix_()函数5. 线性代数 简单数组操作6. 技巧和提示6.1 “自动”整形6.2 矢量堆叠1. 广播&#xff08;Broadcasting&#xff09;规则 Broadcasting允许通用函数以有意义…

Intel PAUSE指令变化影响到MySQL的性能,该如何解决?

MySQL得益于其开源属性、成熟的商业运作、良好的社区运营以及功能的不断迭代与完善&#xff0c;已经成为互联网关系型数据库的标配。可以说&#xff0c;X86服务器、Linux作为基础设施&#xff0c;跟MySQL一起构建了互联网数据存储服务的基石&#xff0c;三者相辅相成。本文将分…

会议 | CCKS 2019 全国知识图谱与语义计算大会在杭州隆重召开

本文转载自公众号&#xff1a;中国中文信息学会。2019 年全国知识图谱与语义计算大会(CCKS 2019)于 8 月 24 日至 27 日在杭州召开&#xff0c;由中国中文信息学会语言与知识计算专业委员会主办&#xff0c;浙江大学承办。本次会议主题是“知识智能”。大会吸引了来自海内外的八…

Hystrix 简介和使用

Hystrix一、概念二、使用1. 环境搭建2. 服务降级3. 异常熔断4. 自定义异常熔断器5.Hystrix仪表盘监控三、测试1. 异常熔断2. 超时熔断3. 熔断器获得异常4. 异常忽略5. 自定义异常熔断器一、概念 故障蔓延&#xff1a;由于一个服务变慢或没有响应导致大量请求堆积&#xff0c;进…

android中如何使用一张图片适配不同尺寸的APP引导页

在我们平常开发的过程中在做引导页适配的时候&#xff0c;有时候会犯难&#xff0c;怎么样作图可以将各种不同尺寸分辨率的手机都适配好也就是不变形不拉伸&#xff0c;官方给的说法也只是做多套图去适配不同的分辨率&#xff0c;遇到全屏展示引导这种问题的时候就有些力不从心…

还在用Tensorboard?机器学习实验管理平台大盘点

文 | SisyphusBJ源 | Pytorch Lightningwandb.aicomet.mlneptune.aiallegro trainsmlflowguild.aisacredtest-tubetensorboard相信很多同学看到上面这个列表的第一印象是懵的。我们先看下机器学习实验管理平台 到底是做神马滴&#xff1a;一句话概括就是&#xff1a;&#xff0…

论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究方向为跨语言知识图谱问答。来源&#xff1a;NAACL2019链接&#xff1a;https://arxiv.org/pdf/1904.02342.pdf本文关注如何从信息抽取结果&#xff08;特别是知识图谱&#xff09;出发&#xff0c;生…

LeetCode 230. 二叉搜索树中第K小的元素(中序遍历)

文章目录1. 题目信息2. 解题2.1 中序递归2.2 中序循环写法1. 题目信息 给定一个二叉搜索树&#xff0c;编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明&#xff1a; 你可以假设 k 总是有效的&#xff0c;1 ≤ k ≤ 二叉搜索树元素个数。 示例 1:输入: root …

Apache Doris在美团外卖数仓中的应用实践

序言 美团外卖数据仓库技术团队负责支撑日常业务运营及分析师的日常分析&#xff0c;由于外卖业务特点带来的数据生产成本较高和查询效率偏低的问题&#xff0c;他们通过引入Apache Doris引擎优化生产方案&#xff0c;实现了低成本生产与高效查询的平衡。并以此分析不同业务场景…