android是如何加载资源图片的
2015-05-12 10:25
211 查看
每个drawable文件夹加载顺序是什么? 图片是如何缩放的? (这边只讨论加载图片,不考虑布局对图片的拉伸)
OK!今天就先搞这2个问题 废话不多说 直接上代码
我们看到加载图片就一步 Drawable res = loadDrawable(value, id);需要2个参数TypedValue和资源id。由于本人C层代码很挫,一看就头大! 没事,我只要搞清楚这个方法是干啥的就可以了~~
第一个问题: 这个TypedValue是啥 干什么用的?文档是说:
Container for a dynamically typed data value. Primarily used with Resources for holding resource values.
解释有点模糊,写段代码输出看看就知道了
结果:TypedValue包含了 data:46 density:320 resourceId=xxxxxxx string res/drawable-xhdpi/login_bg.png. 哦 TypedValue就是保存加载图片的一些信息
图片路径啊 我这个图片是从多少dpi文件夹下获取的等等。
第二个问题 得到Drawable会缩放嘛? 是怎么缩放的呢?
试验: 我在1280*720 4.5寸(属于xdpi 320) 设备上加载图片 我把分辨率为480*853图片放在hdpi( 240 )文件夹下面,按上次分析的,图片会先从drawable-xdpi找 然后在drawable-hdpi找到了
最后得到的drawable是640x1137 说明图片被放大了 怎么算的呢 640 = 480x(320/240) 1137 = 853x(320/240) 哦!原来是根据对应的dpi做缩放
上次有人说 drawable-nodpi 中 图片不会被拉伸 对这个质疑
我做了试验在这个文件下放800*480的图片 不管在什么dpi设备下
传入的TypedValue的density是65535 得到 drawable都是800*480
说明drawable-nodpi 下的图片在C层不会缩放图片##
第三个问题 如果我在drawable-(xdpi,hdpi,mdpi,ldpi,nodpi)这几个文件夹都放入同一个图片,系统是怎么加载的呢?
百度一搜索有好多,本人想自己在试验下
试验1: 我在1280*720 4.5寸(属于xdpi 320) 设备上 我在drawable-(xdpi,hdpi,mdpi,ldpi,nodpi,1280*720)的文件夹下分别放入不同分辨率的图片
结果:加载过程是 xdpi----->hdpi----->nodpi-1208*720----->nodpi----->mdpi----->drawable----->ldpi
试验2: 我在1280*800 8寸(dpi 189)设备上 我在drawable-(xdpi,hdpi,mdpi,ldpi,nodpi,1280*800)的文件夹下分别放入不同分辨率的图片
结果:加载过程是 hdpi----->xdpi----->mdpi----->drawable----->ldpi----->nodpi-1208*720----->nodpi
结论: 会先到对应dpi文件夹下的找,找不到会往上比自己dpi高的文件找,然后才会往比自己dpi低的下面
如有错误,请指正。谢谢!
OK!今天就先搞这2个问题 废话不多说 直接上代码
public Drawable getDrawable(int id) throws NotFoundException { TypedValue value; synchronized (mAccessLock) { value = mTmpValue; if (value == null) { value = new TypedValue(); } else { mTmpValue = null; } getValue(id, value, true); } Drawable res = loadDrawable(value, id); synchronized (mAccessLock) { if (mTmpValue == null) { mTmpValue = value; } } return res; } |
第一个问题: 这个TypedValue是啥 干什么用的?文档是说:
Container for a dynamically typed data value. Primarily used with Resources for holding resource values.
解释有点模糊,写段代码输出看看就知道了
TypedValue mTypedValue = new TypedValue(); Resources res = getResources(); res.getValue(R.drawable.login_bg, mTypedValue, true); |
图片路径啊 我这个图片是从多少dpi文件夹下获取的等等。
第二个问题 得到Drawable会缩放嘛? 是怎么缩放的呢?
试验: 我在1280*720 4.5寸(属于xdpi 320) 设备上加载图片 我把分辨率为480*853图片放在hdpi( 240 )文件夹下面,按上次分析的,图片会先从drawable-xdpi找 然后在drawable-hdpi找到了
最后得到的drawable是640x1137 说明图片被放大了 怎么算的呢 640 = 480x(320/240) 1137 = 853x(320/240) 哦!原来是根据对应的dpi做缩放
上次有人说 drawable-nodpi 中 图片不会被拉伸 对这个质疑
我做了试验在这个文件下放800*480的图片 不管在什么dpi设备下
传入的TypedValue的density是65535 得到 drawable都是800*480
说明drawable-nodpi 下的图片在C层不会缩放图片##
第三个问题 如果我在drawable-(xdpi,hdpi,mdpi,ldpi,nodpi)这几个文件夹都放入同一个图片,系统是怎么加载的呢?
百度一搜索有好多,本人想自己在试验下
试验1: 我在1280*720 4.5寸(属于xdpi 320) 设备上 我在drawable-(xdpi,hdpi,mdpi,ldpi,nodpi,1280*720)的文件夹下分别放入不同分辨率的图片
结果:加载过程是 xdpi----->hdpi----->nodpi-1208*720----->nodpi----->mdpi----->drawable----->ldpi
试验2: 我在1280*800 8寸(dpi 189)设备上 我在drawable-(xdpi,hdpi,mdpi,ldpi,nodpi,1280*800)的文件夹下分别放入不同分辨率的图片
结果:加载过程是 hdpi----->xdpi----->mdpi----->drawable----->ldpi----->nodpi-1208*720----->nodpi
结论: 会先到对应dpi文件夹下的找,找不到会往上比自己dpi高的文件找,然后才会往比自己dpi低的下面
如有错误,请指正。谢谢!
相关文章推荐
- android是如何加载资源图片的
- android是如何加载资源图片的?
- Android ImageView如何加载网络图片资源
- Android ImageView如何加载网络图片资源
- Android ImageView如何加载网络图片资源
- Android ImageView如何加载网络和本地图片资源
- android是如何加载资源图片的?
- Android图片加载方案——如何保证图片清晰度同时,最大限度节省内存使用量
- 【解决方案】Android图片加载中drawable等图片资源报错,提示找不到该资源
- Android React Native加载图片资源的正确姿势
- android客户端加载网络大图片如何避免内存溢出的两种方法
- Android加载图片资源的几种方式
- android如何将图片资源打包进jar包中
- Android如何提升图片加载速度
- Android中如何加载大图片
- Android ListView 加载图片如何解决多张地址一样会导致部分图片加载不了的问题
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- Android ImageView图片浏览器(ImageView加载sd卡图片资源)的内存溢出问题分析
- android如何加载大图片
- Android开发中如何解决加载大图片时内存溢出的问题