Android屏幕适配

首先介绍几个概念:
1,屏幕密度(dpi)dot per inch:即没英寸像素数(1英寸=2.54cm).
ldpi(120),mdpi(160),hdpi(240),xhdpi(320)

计算方法:
以480*854,4.0英寸手机为例,其对角线为4.0英寸,对角线像素为:(480^2 + 854^2)开根号 = 979.

所以其 屏幕密度=对角线像素/尺寸,即dpi = 979 / 4 = 245,约为240
2)屏幕尺寸:对角线长度。有small,normal,large,extra large

3)方向:横屏和竖屏

4)分辨率:一个物理屏幕上总的像素点数,如480x800等。我们应用中并不使用分辨率这个概念,主要是dpi和尺寸

5)dp(density-independent pixel)独立像素单位。一个抽象概念,用来定位UI布局,包括尺寸和位置。

Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多。 
上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;

好了,上述这些概念记不记得住没关系,只要记住一点dp是与像素无关的,在实际使用中1dp大约等于1/160inch。



1,Android屏幕大小

Android将屏幕分为四种大小:small,normal,large,xlarge

区分:对设备的对角线用尺子量一下,用英寸做单位进行区分,比如4.7英寸,属于normal,具体分类如图1所示:

20140609113244687.png

图1 android屏幕大小区分

2 屏幕的分辨率和密度

我们这里用一个小程序来求两个设备的分辨率和密度。

分辨率Resolution):The total number of physical pixels on a screen. 即一个设备的物理像素,如1280*720,大家可以自己计算。

密度Screen density):The quantity of pixels within a physical area of the screen; usually referred to as dpi (dots per inch).一般我们的密度的单位是像素数目/平方英寸,但是这里推荐了一个新的密度表示方法,就是每英寸的像素数目(dpi)。我们以后用到的密度就是这个dpi

packagecom.example.testscreen; 
   
importandroid.os.Bundle; 
importandroid.app.Activity; 
importandroid.util.DisplayMetrics; 
importandroid.view.Menu; 
   
publicclassMainActivity extendsActivity { 
    @Override 
    protectedvoidonCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
           
         DisplayMetrics metrics = newDisplayMetrics(); 
         getWindowManager().getDefaultDisplay().getMetrics(metrics); 
            
         //得到设备的分辨率,即宽和高的像素数目 
         intheight = metrics.heightPixels; 
         intwidth = metrics.widthPixels; 
            
         System.out.println("the height is "+height +" the width is" + width); 
            
         //得到设备的密度 
         intdensity = metrics.densityDpi; 
         System.out.println("the density is " + density); 
           
    
}

设备1的输出是:

?
1
2
06-0900:10:17.188: I/System.out(2041): the height is 1184the width is768 
06-0900:10:17.188: I/System.out(2041): the density is 320
设备2的输出是:

?
1
2
06-0900:45:35.085: I/System.out(2088): the height is 736the width is480 
06-0900:45:35.085: I/System.out(2088): the density is 213

    从两个设备的输出可以知道,其实是定义了两个4.7英寸的avd,但是有着不同的分辨率,(android里有底部栏,看起来有点不一样),这两个例子说明了一个问题:相同大小的手机,可以有不同的分辨率,进而就有不同的密度,(因为密度=分辨率/大小)。

3 程序判断屏幕大小

如何判定大小(设备的真实尺寸,可以理解为设备对角线的英寸数)呢,就根据2所提到的两个参数来判断,一个是分辨率,一个是密度,用设备1而言,知道height是1184像素(px),其密度为320dpi(像素/英寸),则高度的具体值就是1280/320=4(英寸),宽度为800/320=2.5 ,用勾股定理算出对角线的长度,再和图1匹配,得到这个设备的屏幕大小尺寸。

      屏幕大小判定之后,首先需要在mainfest声明支持的屏幕大小,如:

1
<supports-screensandroid:largeScreens="true"/>
4 去英寸化 

?
 dp在官网里叫Density-independent pixel (dp),即密度无关的像素,即可以摆脱密度的缠绕,我们先不提dp的具体计算(后面会说),我们就先假设这个dp就是一个全新的度量单位,让相等的dp在不同密度的屏幕里有相等的长度,比如1dp无论你是在设备1还是设备2,大小都是相等。这就是解决了“去英寸化”的问题。

5 dp的应用与图片问题

   通过3的描述,我们应该可以知道,在layout里任何的控件都采用dp就可以保证显示一致的问题了。这也是google所推荐的。

    但是对于图片这种外来户,我们可以规定它在layout中的大小,假如我们规定了图片的宽度1英寸(可以转为dp,后面会将),对于一张图片,其真实的宽度为15像素,在密度为3dpi的屏幕中,可以显示3个像素,这时需要丢掉12个像素,图片一定极为不清晰;在密度为15dpi的屏幕里可以显示15个像素,显示完全。这就有了分辨率的问题,在宽度都为1英寸的情况下,肯定是能够显示全部15个像素的图片清晰,怎么能让不同密度的屏幕显示的照片都比较清晰呢,我们可以对不同密度的屏幕选择不同的图片,即高密度选择高清图片。对于任何一张图片,我们都可以做三张,一张低分辨率,一张高分辨率,一张中间值,对于高密度的屏幕,比如密度为15,我们选择一张分辨率较高的图片(就是大的图片),如15英寸的,对于密度为3的,我们让它显示一张分辨率为3的,则保证了不会丢失信息,从而保证图片清晰。

    对于不同密度的屏幕,可以通过/res/drawable-hdpi等进行选择图片。这个官网也有。

6 dp的计算  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值