有些时候需要将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类型是什么呢相关推荐

  1. Android 代码实现查看SQLite数据库中的表

    前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的函数,对于数据库的查看很不方便,于是 ...

  2. andriod studio 查看项目依赖_Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图...

    Maven 组件界面介绍 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有: 第一个按钮:Reimport All Maven Projects 表示根据 pom.xml 重新载入项 ...

  3. 在linux系统中如何查看cpu,Linux中如何查看CPU的信息

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. top - 02:53:32 up 16 days, ...

  4. Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图

    IntelliJ IDEA使用教程 (总目录篇) Maven 组件界面介绍 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有: 第一个按钮:Reimport All Maven Pr ...

  5. Maven Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图

    原文地址: https://blog.csdn.net/qq_27093465/article/details/69226949 IntelliJ IDEA使用教程 (总目录篇) Maven 组件界面 ...

  6. WINDOWS中, 如何查看一个运行中的程序是64位还是32位的

    转自:https://blog.csdn.net/dayday3923/article/details/78597453?locationNum=7&fps=1 方法一: 任务管理器法 任务管 ...

  7. android资源目录---assets与res/raw区别

    android资源目录---assets与res/raw的不同 Android 2011-05-24 14:40:21 阅读20 评论0   字号:大中小 订阅 assets:用于存放需要打包到应用程 ...

  8. android 从assets和res中读取文件(转)

    1. 相关文件夹介绍 在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译, ...

  9. Android从assets和res中读取文件

    1. 相关文件夹介绍 在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译, ...

最新文章

  1. Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)
  2. 使用Quartus建立第一个FPGA工程
  3. 计算机管理器win,进入windows启动管理器,win启动管理器
  4. tomcat 配置异常/404页面
  5. RDD基本转换操作:zipWithIndex、zipWithUniqueId
  6. Earliest PEP Algorithm Principles
  7. 《Reids 设计与实现》第一章 简单动态字符串和链表
  8. c语言编写一元二次方程
  9. C#为null或Empty
  10. android开发学习 ------- json数据与实体类之间的相互转换
  11. mysql怎么判断2个时间戳为同一天_php如何判断两个时间戳是一天
  12. LinearLayout布局问题
  13. 【高效程序员系列】1、好马配好鞍——舒适的工作环境
  14. Ubuntu 安装 VMware 15
  15. ARM开发经典学习网站推荐 (转)
  16. 计划制定与管理-日事清
  17. 体验灵魂出窍:错觉延伸人体对自身感觉
  18. SDN相关组织——ONF
  19. 视频号如何使用OBS推流?
  20. 英语口语235之每日十句口语

热门文章

  1. 双向循环链表的插入与删除
  2. 我妈在深圳的这些日子
  3. C语言大神进来看看这个题目
  4. Kconfig中的“depends on”和“select”
  5. Class_fileAndroid应用调用方法
  6. java requestparams_java – 如何验证@RequestParams不为空?
  7. java spring注解_spring注解是如何实现的?
  8. python空列表添加_Python列表的简单操作
  9. linux sqlserver 管理工具,Linux连接SqlServer的图形化工具SQuirrel
  10. ubuntu18.04安装python3_在 Ubuntu 18.04 上安装 Python 3.7