不同类型Drawable解析
这里简单分析下不同xml是怎么解析成Drawable的
一般获取一个Drawable资源有很多方法,如下方截图是一种,不同方法最后其实殊途同归,都是一个地方解析转化的,这里只以下面代码为入口分析
前面代码片段比较简单,Resources的gerDrawable方法有多个不同数量参数的重载方法最后调用到三个参数的方法,然后会调用到getDrawableForDensity方法,这里先是调用ResourcesImpl的getValueForDensity接口根据id等信息从资源管理中获取对应资源文件信息,然后调用loadDrawable方法获取Drawable
ResourcesImpl的loadDrawable方法较长,这里只截取主要部分:
上面截图代码中,前面部分是之前加载过的图片会保存一般会保存个缓存信息,再次加载时直接从缓存信息中获取相关信息生成图片,这里不细述,后面部分即是生成图片的地方,cs不为空则是从缓存获取信息,isColorDrawable一般是直接设置颜色的那种,这里是直接创建ColorDrawable,至于isColorDrawable的判断,如下代码所示,对于颜色资源,其TypedValue的type是有固定范围的,这里也是因此判断的
剩下的就是我们比较关心的主要部分了,即loadDrawableForCookie,仍是截取主要部分代码如下:
这里根据资源文件是否xml类型分别处理,
如果不是xml类型,调用decodeImageDrawable方法,这里一般对应png等二进制图片资源,一般解析成BitmapDrawable、NinePatchDrawable或AnimatedImageDrawable
如果是xml类型也分两种,一种是解析成ColorStateListDrawable,如下面这种
其他的主要是调用loadXmlDrawable方法:
继续走读代码:
上面r.getDrawableInflater方法返回的是一个DrawableInflater的对象,查看其inflateFromXmlForDensity方法
这里就到关键代码了,这里生成Drawable有两个地方,一是inflateFromTag,一是inflateFromClass
如上代码所示,基本上常用的xml类型的图片都在这里定义了,根据不同的tag而创建对应的Drawable对象
顺便也看下inflateFromClass方法,这里看着用于解析指定class的Drawable,一般如果应用自定义drawable类型的话可以使用这种,如下方所示
标签:xml,这里,代码,类型,Drawable,解析,方法 From: https://www.cnblogs.com/luoliang13/p/18277085