Android(density屏幕密度)

来源:互联网 发布:元和网络客服电话 编辑:程序博客网 时间:2024/04/29 21:59

做android开发已经有段时间了,android的多分辨率一直是个很头疼的问题。以前也多少碰到过,但是从来没有这次这么怪异,趁着这个机会,把之前了解的总结一下。

如何对应多分辨率,晚上有很多人总结过了,基本也就是这么几种

1,使用wrap_content,fill_parent,或者dp来布局,尽量不要使用px

   之前看见过利用layout_weight重要度来布局,等分屏幕,这种方式也挺好的。

2,不同分辨率访问不同的文件夹

   可以根据屏幕密度,分辨率,大小来命名不同的文件夹,不同的设备会访问不同的文件夹

   例如:drawable-mdpi,drawable-hdpi-1280x800,drawable-large

   同样layout等文件夹也可以利用这种方式。


介绍了这些基本概念,来说一下我这次碰到的问题,这次出问题的是平板,型号是GALAXY TAB,7英寸的,分辨率是1024*600

自己先通过android的模拟器进行测试过,没有什么问题,在drawable下面建立了一个drawable-mdpi-1024*600的文件夹,读取该文件夹下的图片。

但是实机的时候发现不对了,没有读取到,瞬间迷惑了,莫非是模拟器算错了屏幕密度。


在这里先解释下这么几个概念:

px:这是我们通常所说的像素,例如1024*768

dp:也就是dip,表示独立像素,是根据px和dpi来决定的,px = dp * (dpi / 160)

density:屏幕密度,等于dpi/160

dpi:每英寸像素数 dpi= 2012-01-14 0_1290442711yV9k.gif/屏幕尺寸


7英寸,1024*600分辨率,算出来dpi为169,density等于1,应该是mdpi,可以为什么读取了hdpi文件夹下的图片。


细细分析了下,android不可能自己来算dpi的,问题可能就出在这方面,打开源码后发现:

其实dpi是读取/system/build.prop文件夹下面ro.sf.lcd_density来设定的

从这个方法中可以看到,系统会去读系统的属性。先去读ro.sf..lcd_density,若存在,那么设置这个属性记录的density的值。否则,则取默认值也就是160。

1 private   static   int   getDeviceDensity()   { 2                 //   qemu.sf.lcd_density   can   be   used   to   override   ro.sf.lcd_density 3                 //   when   running   in   the   emulator,   allowing   for   dynamic   configurations. 4                 //   The   reason   for   this   is   that   ro.sf.lcd_density   is   write-once   and   is 5                 //   set   by   the   init   process   when   it   parses   build.prop   before   anything   else. 6                 return   SystemProperties . getInt( " qemu.sf.lcd_density " , 7                                 SystemProperties . getInt( " ro.sf.lcd_density " ,   DENSITY_DEFAULT)); 8         }


终于明白了,其实不是屏幕密度算错了,而是手机里设置density这个值为240,才导致文件夹读取错误。

最后很感谢一直看到这的人。