Android中如何查看在res中存放的drawable文件对应的JAVA类型是什么呢
有些时候需要将res中的资源文件加载进来然后做一些修改,然后再赋值给控件使用,比如这样:
Drawable drawable = getResources().getDrawable(int id);
现在我需要把资源文件id所对应的Drawable对象加载进来,然后做向下转型处理,如果我不调试查看本身的类型的话,该怎么知道它到底是哪种类型呢?我们来通过源代码查看究竟:
首先我们找到getResources().getDrawable()方法:
public Drawable getDrawable(int id) throws NotFoundException {synchronized (mTmpValue) {TypedValue value = mTmpValue;getValue(id, value, true);return loadDrawable(value, id);}}
这个方法并没有做什么,进入到loadDrawable方法中:
/*package*/ Drawable loadDrawable(TypedValue value, int id)throws NotFoundException {if (TRACE_FOR_PRELOAD) {// Log only framework resourcesif ((id >>> 24) == 0x1) {final String name = getResourceName(id);if (name != null) android.util.Log.d("PreloadDrawable", name);}}final long key = (((long) value.assetCookie) << 32) | value.data;Drawable dr = getCachedDrawable(key);if (dr != null) {return dr;}Drawable.ConstantState cs = sPreloadedDrawables.get(key);if (cs != null) {dr = cs.newDrawable(this);} else {if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT &&value.type <= TypedValue.TYPE_LAST_COLOR_INT) {dr = new ColorDrawable(value.data);}if (dr == null) {if (value.string == null) {throw new NotFoundException("Resource is not a Drawable (color or path): " + value);}String file = value.string.toString();if (DEBUG_LOAD) Log.v(TAG, "Loading drawable for cookie "+ value.assetCookie + ": " + file);if (file.endsWith(".xml")) {try {XmlResourceParser rp = loadXmlResourceParser(file, id, value.assetCookie, "drawable");dr = Drawable.createFromXml(this, rp);rp.close();} catch (Exception e) {NotFoundException rnf = new NotFoundException("File " + file + " from drawable resource ID #0x"+ Integer.toHexString(id));rnf.initCause(e);throw rnf;}} else {try {InputStream is = mAssets.openNonAsset(value.assetCookie, file, AssetManager.ACCESS_STREAMING);// System.out.println("Opened file " + file + ": " + is);dr = Drawable.createFromResourceStream(this, value, is,file, null);is.close();// System.out.println("Created stream: " + dr);} catch (Exception e) {NotFoundException rnf = new NotFoundException("File " + file + " from drawable resource ID #0x"+ Integer.toHexString(id));rnf.initCause(e);throw rnf;}}}}if (dr != null) {dr.setChangingConfigurations(value.changingConfigurations);cs = dr.getConstantState();if (cs != null) {if (mPreloading) {sPreloadedDrawables.put(key, cs);} else {synchronized (mTmpValue) {//Log.i(TAG, "Saving cached drawable @ #" +// Integer.toHexString(key.intValue())// + " in " + this + ": " + cs);mDrawableCache.put(key, new WeakReference<Drawable.ConstantState>(cs));}}}}return dr;}
这一大段我们看主要的:
if (file.endsWith(".xml")) {try {XmlResourceParser rp = loadXmlResourceParser(file, id, value.assetCookie, "drawable");dr = Drawable.createFromXml(this, rp);rp.close();} catch (Exception e) {NotFoundException rnf = new NotFoundException("File " + file + " from drawable resource ID #0x"+ Integer.toHexString(id));rnf.initCause(e);throw rnf;}}
这里以selector说明,selector是定义在xml中的,我们就找到这个地方,它原来是使用XmlResourceParser来对xml资源文件进行解析的,咱们进去createFromXml方法内部一探究竟:
/*** Create a drawable from an XML document. For more information on how to* create resources in XML, see* <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.*/public static Drawable createFromXml(Resources r, XmlPullParser parser)throws XmlPullParserException, IOException {AttributeSet attrs = Xml.asAttributeSet(parser);int type;while ((type=parser.next()) != XmlPullParser.START_TAG &&type != XmlPullParser.END_DOCUMENT) {// Empty loop}if (type != XmlPullParser.START_TAG) {throw new XmlPullParserException("No start tag found");}Drawable drawable = createFromXmlInner(r, parser, attrs);if (drawable == null) {throw new RuntimeException("Unknown initial tag: " + parser.getName());}return drawable;}
从这段代码中我们可以发现,最主要的工作是由方法createFromXmlInner来完成的,我们进去看看:
/*** Create from inside an XML document. Called on a parser positioned at* a tag in an XML document, tries to create a Drawable from that tag.* Returns null if the tag is not a valid drawable.*/public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs)throws XmlPullParserException, IOException {Drawable drawable;final String name = parser.getName();if (name.equals("selector")) {drawable = new StateListDrawable();} else if (name.equals("level-list")) {drawable = new LevelListDrawable();} else if (name.equals("layer-list")) {drawable = new LayerDrawable();} else if (name.equals("transition")) {drawable = new TransitionDrawable();} else if (name.equals("color")) {drawable = new ColorDrawable();} else if (name.equals("shape")) {drawable = new GradientDrawable();} else if (name.equals("scale")) {drawable = new ScaleDrawable();} else if (name.equals("clip")) {drawable = new ClipDrawable();} else if (name.equals("rotate")) {drawable = new RotateDrawable();} else if (name.equals("animated-rotate")) {drawable = new AnimatedRotateDrawable(); } else if (name.equals("animation-list")) {drawable = new AnimationDrawable();} else if (name.equals("inset")) {drawable = new InsetDrawable();} else if (name.equals("bitmap")) {drawable = new BitmapDrawable();if (r != null) {((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics());}} else if (name.equals("nine-patch")) {drawable = new NinePatchDrawable();if (r != null) {((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics());}} else {throw new XmlPullParserException(parser.getPositionDescription() +": invalid drawable tag " + name);}drawable.inflate(r, parser, attrs);return drawable;}
噢噢,原来是这样啊,我定义什么样类型的图片,最后就有什么样的Java类型与之对应,原来我的selector对应StateListDrawable,恍然大悟,接下来就容易处理了。
Android中如何查看在res中存放的drawable文件对应的JAVA类型是什么呢相关推荐
- Android 代码实现查看SQLite数据库中的表
前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的函数,对于数据库的查看很不方便,于是 ...
- andriod studio 查看项目依赖_Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图...
Maven 组件界面介绍 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有: 第一个按钮:Reimport All Maven Projects 表示根据 pom.xml 重新载入项 ...
- 在linux系统中如何查看cpu,Linux中如何查看CPU的信息
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. top - 02:53:32 up 16 days, ...
- Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图
IntelliJ IDEA使用教程 (总目录篇) Maven 组件界面介绍 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有: 第一个按钮:Reimport All Maven Pr ...
- Maven Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图
原文地址: https://blog.csdn.net/qq_27093465/article/details/69226949 IntelliJ IDEA使用教程 (总目录篇) Maven 组件界面 ...
- WINDOWS中, 如何查看一个运行中的程序是64位还是32位的
转自:https://blog.csdn.net/dayday3923/article/details/78597453?locationNum=7&fps=1 方法一: 任务管理器法 任务管 ...
- android资源目录---assets与res/raw区别
android资源目录---assets与res/raw的不同 Android 2011-05-24 14:40:21 阅读20 评论0 字号:大中小 订阅 assets:用于存放需要打包到应用程 ...
- android 从assets和res中读取文件(转)
1. 相关文件夹介绍 在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译, ...
- Android从assets和res中读取文件
1. 相关文件夹介绍 在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译, ...
最新文章
- Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)
- 使用Quartus建立第一个FPGA工程
- 计算机管理器win,进入windows启动管理器,win启动管理器
- tomcat 配置异常/404页面
- RDD基本转换操作:zipWithIndex、zipWithUniqueId
- Earliest PEP Algorithm Principles
- 《Reids 设计与实现》第一章 简单动态字符串和链表
- c语言编写一元二次方程
- C#为null或Empty
- android开发学习 ------- json数据与实体类之间的相互转换
- mysql怎么判断2个时间戳为同一天_php如何判断两个时间戳是一天
- LinearLayout布局问题
- 【高效程序员系列】1、好马配好鞍——舒适的工作环境
- Ubuntu 安装 VMware 15
- ARM开发经典学习网站推荐 (转)
- 计划制定与管理-日事清
- 体验灵魂出窍:错觉延伸人体对自身感觉
- SDN相关组织——ONF
- 视频号如何使用OBS推流?
- 英语口语235之每日十句口语
热门文章
- 双向循环链表的插入与删除
- 我妈在深圳的这些日子
- C语言大神进来看看这个题目
- Kconfig中的“depends on”和“select”
- Class_fileAndroid应用调用方法
- java requestparams_java – 如何验证@RequestParams不为空?
- java spring注解_spring注解是如何实现的?
- python空列表添加_Python列表的简单操作
- linux sqlserver 管理工具,Linux连接SqlServer的图形化工具SQuirrel
- ubuntu18.04安装python3_在 Ubuntu 18.04 上安装 Python 3.7