图片资源在不同分辨率设备文件夹下获取大小出现差异的问题(分辨率适配问题)
来源:互联网 发布:天云大数据 雷涛 编辑:程序博客网 时间:2024/05/30 23:17
问题:
今天做Pad项目的时候 分辨率为:480 800 DPI为160 有一些图片资源放置到了drawable-hdpi下面了,但是在代码中获取图片资源的时候图片的高宽却不是实际图片的高宽;
解决方法:
由于该Pad属于sw340dp范畴,所以新建了一个sw340dp文件夹 把资源放置到了这里,在代码中实际获取到的高宽和图片是一致的;
Ps.待续 需要究其原因
---------------------------------------------------------
找到一篇文章 对此问题做了详细的介绍
pi是什么呢?
dpi是“dot per inch”的缩写,每英寸像素数。
四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
dpi计算公式
DPI=对角线的像素值/尺寸
手机屏幕分辨率和屏幕密度是两码事!并不是800*480的分辨率手机图片就应该放在hdpi文件夹中。5.0英寸 800*480属于mdpi
也可以通过代码获取:
- DisplayMetrics metric = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(metric);
- int width = metric.widthPixels; // 屏幕宽度(像素)
- int height = metric.heightPixels; // 屏幕高度(像素)
- float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
- int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
android会根据屏幕本身的尺寸与密度特性,自动载入对应的资源,并把它们从逻辑像素(DIP,用于定义界面布局)转换成屏幕上的物理像素。
首先看看 系统是如何通过Resources的getDrawable(int id)方法找图片的
- 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 我们可以理解为存储数据的类型,主要被Resouces使用于持有的资源值
通过getValue(id,value,true)方法去得到该id的资源的属性
- public void getValue(int id, TypedValue outValue, boolean resolveRefs)
- throws NotFoundException {
- boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs);
- if (found) {
- return;
- }
- throw new NotFoundException("Resource ID #0x"
- + Integer.toHexString(id));
- }
最后通过loadDrawable(value, id)得到drawable,该方法到了底层的C代码,大致意思就是通过TypedValue中的方法和属性就可以获得我们想要的属性值,然后加载图片
OK,下面来做个实验.
试验一: 手机是1280*720 4.3英寸 属于xdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该不会充满 整个手机) 我把图片放在不
文件夹 加载时间(ms) 图片显示 说明
drawable 311 充满屏幕 图片有拉伸
drawable-nodpi 130 未充满屏幕 图片显示正常
drawable-ldpi 442 充满屏幕 图片有拉伸
drawable-mdpi 383 充满屏幕 图片有拉伸
drawable-hdpi 226 充满屏幕 图片有拉伸
drawable-xhdpi 109 未充满屏幕 图片显示正常
试验二: 手机是800*480 4.3英寸 属于hdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该充满 整个手机) 我把图片放在不同drawable文件夹中
文件夹 加载时间(ms) 图片显示 说明
drawable 290 充满屏幕 图片拉伸
drawable-nodpi 127 充满屏幕 图片显示正常
drawable-ldpi 369 充满屏幕 图片拉伸
drawable-mdpi 346 充满屏幕 图片拉伸
drawable-hdpi 124 充满屏幕 图片显示正常
drawable-xhdpi 241 未充满屏幕 图片缩放
得到结论:
drawable-nodpi 中 图片不会被拉伸
系统在得到图片时候,会先到设备对应的dpi的文件夹下去去找资源文件,找到后应该不会做缩放直接返回图片。
如果没有在对应的dpi文件夹中找到,回去其他文件夹中查找,找到后会做相应的缩放。
在高dpi找到的图片会缩放,在低dpi的会拉伸
还有就是 源码中可以看出 loadDrawable的过程实在C层做的。通过系统资源id加载会比java层直接加载图片更便捷
- 图片资源在不同分辨率设备文件夹下获取大小出现差异的问题(分辨率适配问题)
- 图片的分辨率大于设备分辨率或者小于设备的分辨率的显示问题
- 图片的分辨率大于设备分辨率或者小于设备的分辨率的显示问题
- 不同分辨率设备适配
- 不同分辨率下Icon的大小
- 移动设备分辨率以及适配问题
- 移动设备分辨率以及适配问题
- 同一图片在不同的分辨率下的展示分析
- 手机h5适配不同分辨率的问题
- 移动端不同分辨率手机的适配问题
- 在不同分辨率下用js获取div的高度
- Android图片自适应不同分辨率屏幕问题
- Android图片自适应不同分辨率屏幕问题
- Android图片分辨率应该放到哪个文件夹的问题
- WEB页面适配不同分辨率下的屏宽问题
- iphone 不同分辨率的问题之一(游戏中不同分辨率显示效果相同或者不同)
- android不同分辨率问题
- cocos2d-x 获取屏幕大小 实际设计大小 分辨率适配问题
- Java线程(六):Callable和Future
- Android项目export成jar file,调用资源
- 生产者消费者模式
- poj1151--Atlantis--扫描线
- Qt5.0.2 + MinGW编译出来的程序发布
- 图片资源在不同分辨率设备文件夹下获取大小出现差异的问题(分辨率适配问题)
- Android中的各种布局
- nyoj-655-光棍的yy
- 使用命令创建数据库
- 100题15输入一颗二元查找树,把该树转化为它的镜像
- 链式方法加载js文件
- linux下memcached安装以及启动
- c++ string类的操作函数总结
- [leetcode] Longest Consecutive Sequence