【Android】drawable—hdpi、drawable—mdpi、drawable—ldp

    “在Android平台上,应用的图片资源文件夹有三种选择drawable—hdpi、drawable—mdpi、drawable—ldp,平台会根据屏幕本身的尺寸与密度特性,自动载入对应的资源,并把它们从逻辑像素(DIP,用于定义界面布局)转换成屏幕上的物理像素。”

 

跑了一个小程序,只是用于显示一张高清图片,内存使用如下。

现在测试的机器分辨率为1280 * 672

测试的图片分辨率为1280 * 720

加载图片时,Android根据测试机器的分辨率首先加载drawable—mdpi 文件夹中的资源文件。

 

现在将图片分别放在不同的文件夹下,查看其内存使用率:

C:\Users\sz082093>adb shell procrank

PID      Vss         Rss         Pss      Uss             cmdline

19061   23368K   23304K    8852K    7568K   com.example.testmem ----------将图片放在了hdpi文件夹下,需要做图片拉伸

19150   25008K   21376K    7082K    5828K    com.example.testmem ----------将图片放在了mdpi文件夹下

19201   31576K   27868K    13548K     12284K   com.example.testmem ----------将图片放在了ldpi文件夹下,需要做图片压缩

 

太恐怖了,仅仅是因为文件放的地址不一样,内存使用竟然翻倍了~~~

由上述图片可见,在程序中,图片位置最好不好乱放,可能会导致:

(1) 内存资源的浪费

(2) 图片加载失败

(3) 内存溢出

 

使用命令行获取了设备的相关信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
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)
double  diagonalPixels = Math.sqrt(Math.pow(width, 2 )+Math.pow(height, 2 )) ;
double  screenSize = diagonalPixels/( 160 *density) ;
 
Log.d( "ddd" , "width * height: " +width+ " * " +height);
Log.d( "ddd" , "density: " +density);
Log.d( "ddd" , "densityDpi: " +densityDpi);
Log.d( "ddd" , "screenSize: " +screenSize);

 

结果为:

C:\Users\sz082093>adb logcat -s ddd

--------- beginning of /dev/log/system

--------- beginning of /dev/log/main

D/ddd     ( 4210): width * height: 1280 * 672

D/ddd     ( 4210): density: 1.0

D/ddd     ( 4210): densityDpi: 160

D/ddd     ( 4210): screenSize: 9.035485598461214

 

然后参照下面表格。

手机屏幕分类和像素密度的对应关系如表所示(参考:http://blog.csdn.net/moruite/article/details/6028547):

  Low density (120), ldpi Medium density (160), mdpi High density (240), hdpi
Small screen QVGA (240x320)    
Normal screen WQVGA400 (240x400)WQVGA432 (240x432) HVGA (320x480) WVGA800 (480x800)WVGA854 (480x854)
Large screen   WVGA800* (480x800)WVGA854* (480x854)  

可见,该盒子的确是默认先取了drawable—mdpi中资源。

【遗留问题】对于机顶盒设备,screenSize是指所接外设的屏幕物理尺寸吗?

【总结】:需要根据设备的dpi,将资源放在对应的资源文件夹里

【参考文章】:1、http://lanyan-lan.iteye.com/blog/1533981

                  2、http://blog.csdn.net/moruite/article/details/6028547

                  3、http://fixedmail.blog.163.com/blog/static/18571837520122621428569/

                  4、http://www.cnblogs.com/zchajax/archive/2011/05/09/2041136.html

作者: 风倾清凌
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值