关于BitMap中getWidth()与系统如何加载Drawable资源的问题
2016-05-06 23:58
423 查看
是根据drawable文件夹的修饰符进行选择的。
比如drawable、drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawalbe-xxhdpi、drawable-xxxhdpi
根据修饰符进行优先匹配。
不同的dpi修饰符对应的dpi如下
drawable-ldpi 120DPI
drawable-mdpi 160DPI
drawable-hdpi 240DPI
drawable-xhdpi 320DPI
drawalbe-xxhdpi 480DPI
drawable-xxxhdpi 640DPI
dpi是根据手机的当前分辨率ppi归一化得到的。
那么PPI如何得来的?
如果手机的宽为X,高为Y,屏幕大小为Z英寸,那么
公式中的X2其实是X的平方,即X*X。
比如三星手机I9260分辨率是1280*720,屏幕大小是4.65英寸,那么计算得到的PPI就是315.8PPI
找一个最近的DPI值应该是320DPI,也就是这个设备被归一化后就是320DPI。属于xhdpi。
系统取图片时会优先选择drawable-xhdpi里面的图片,如果drawable-xhdpi不存在或者没有这张图,就会就近从其它分辨率和默认的无后缀drawable文件夹下取。
比如工程只有在draw-xxhdpi文件下有img图片,而你的设置是xhdpi,就会从xxhdpi取完图片再压缩到对应大小返回给使用者。
在使用BitmapFactory加载图片时,常会出现这种情况,返回的图片尺寸与实际尺寸不符。这是由于我们把图片资源放到res/drawable文件路径下时,选择的文件不同所致,不同的文件夹会有不同的缩放。
1、加载并显示图片
将70*98的图片放在res/drawable-hdpi中。
这里尺寸和原图相同
2、修改文件存放路径
(1)放到res/drawable-mdpi下,运行效果如图
这里尺寸放大了1.5倍
(2)放到res/drawable-xhdpi下,运行效果如图
尺寸缩小了1.3倍
(3)放到res/drawable-xxdpi下,运行效果如图
尺寸缩小了2倍
3、寻找原因
电脑上图片尺寸,单位是像素。Android手机的屏幕分ldpi、mdpi、hdpi,甚至还有xhdpi,对于mdpi(density=160)设备,1dp=1px,对于hdpi(density=240)的设备,1dp=1.5px。所以,把图片放在了res/drawable-mdpi目录下,而运行的Android设备屏幕属于hdpi,导致图片尺寸会扩大1.5倍。
4、解决办法
(1)现在的Android设备一般都在hdpi及以上,所以建议把图片资源主要放在hdpi中。
(2)修改上述代码,设置缩放为false
比如drawable、drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawalbe-xxhdpi、drawable-xxxhdpi
根据修饰符进行优先匹配。
不同的dpi修饰符对应的dpi如下
drawable-ldpi 120DPI
drawable-mdpi 160DPI
drawable-hdpi 240DPI
drawable-xhdpi 320DPI
drawalbe-xxhdpi 480DPI
drawable-xxxhdpi 640DPI
dpi是根据手机的当前分辨率ppi归一化得到的。
那么PPI如何得来的?
如果手机的宽为X,高为Y,屏幕大小为Z英寸,那么
公式中的X2其实是X的平方,即X*X。
比如三星手机I9260分辨率是1280*720,屏幕大小是4.65英寸,那么计算得到的PPI就是315.8PPI
找一个最近的DPI值应该是320DPI,也就是这个设备被归一化后就是320DPI。属于xhdpi。
系统取图片时会优先选择drawable-xhdpi里面的图片,如果drawable-xhdpi不存在或者没有这张图,就会就近从其它分辨率和默认的无后缀drawable文件夹下取。
比如工程只有在draw-xxhdpi文件下有img图片,而你的设置是xhdpi,就会从xxhdpi取完图片再压缩到对应大小返回给使用者。
在使用BitmapFactory加载图片时,常会出现这种情况,返回的图片尺寸与实际尺寸不符。这是由于我们把图片资源放到res/drawable文件路径下时,选择的文件不同所致,不同的文件夹会有不同的缩放。
1、加载并显示图片
将70*98的图片放在res/drawable-hdpi中。
public class MainActivity extends Activity { TextView tv_wl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv_wl=(TextView)findViewById(R.id.tv_wl); Bitmap bm1=BitmapFactory.decodeResource(getResources(), R.drawable.img); int bm_width=bm1.getWidth(); int bm_height=bm1.getHeight(); tv_wl.setText("width="+bm_width+"; height="+bm_height); } }运行结果如下图所示:
这里尺寸和原图相同
2、修改文件存放路径
(1)放到res/drawable-mdpi下,运行效果如图
这里尺寸放大了1.5倍
(2)放到res/drawable-xhdpi下,运行效果如图
尺寸缩小了1.3倍
(3)放到res/drawable-xxdpi下,运行效果如图
尺寸缩小了2倍
3、寻找原因
电脑上图片尺寸,单位是像素。Android手机的屏幕分ldpi、mdpi、hdpi,甚至还有xhdpi,对于mdpi(density=160)设备,1dp=1px,对于hdpi(density=240)的设备,1dp=1.5px。所以,把图片放在了res/drawable-mdpi目录下,而运行的Android设备屏幕属于hdpi,导致图片尺寸会扩大1.5倍。
4、解决办法
(1)现在的Android设备一般都在hdpi及以上,所以建议把图片资源主要放在hdpi中。
(2)修改上述代码,设置缩放为false
<span style="color: rgb(63, 63, 63);"><span style="white-space:pre"> </span>BitmapFactory.Options bfoOptions = new BitmapFactory.Options(); </span><span style="color:#ff0000;">bfoOptions.inScaled = false;</span><span style="color:#3f3f3f;"> Bitmap img1 = BitmapFactory.decodeResource(getResources(), R.drawable.img, bfoOptions); int bm_width=img1.getWidth(); int bm_height=img1.getHeight();</span>
相关文章推荐
- 单向链表结点删除问题
- 不要使用Android Studio的Git Commit了---->记一次debug
- 框架选择
- Android实现手势控制
- SystemService
- ContentProvider
- 基础算法题----兔子问题(斐波那契数列)
- javaScript 操作Css样式
- gdb调试多进程与多线程
- php实习的tips(常见的字符串处理函数)
- File
- nova boot from volume代码分析
- 数据储存方式-SQLite
- ecshop弹出登录框的效果
- Hashcat
- 数据储存方式-SharedPreferences
- OptionsMenu、ContenxtMenu、SubMenu
- linux中的&&和||(linux中=和==效果是一样的)
- 相关链接
- Android 关于EditText文字的显示问题 和属性