Android 屏幕的尺寸信息

本文详细介绍了Android设备屏幕参数,包括屏幕大小、分辨率和PPI,以及系统如何通过定义标准DPI来处理不同屏幕密度。文章还解释了dp单位的概念及其在不同密度屏幕上的换算,并提供了单位转换的代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android的手机屏幕,不管是分辨率还是大学都是五花八门、千奇百怪的,这在一定程度上造成了绘图是的难度。想要在不同屏幕上保持绘图的准确性,那么我们必须对这些屏幕有充分的的认识。

一、屏幕参数

一块屏幕通常具有以下几个参数。

●  屏幕大小

值屏幕对角线的长度,通常使用“寸”来度量,例如4.7寸的手机,5.5寸的手机等。

●  分辨率

分辨率是指手机屏幕的像素点个数,例如720*1280就是指屏幕的分辨率,值宽有720个像素点,而高有1280个像素点。

●  PPI

每英寸像素(Pixels Per Inch)又被称为DPI(Dots per Inch)。它是由对角线的像素点数除以屏幕的大小得到的,通常达到400PPI就已经是非常高的屏幕密度了。

二、系统屏幕密度

每个厂商的Android手机具有不同的大小尺寸和像素密度的的屏幕。Android系统如果要精确当每种DPI的屏幕,那基本是不可能的。因此,系统定义了几个标准的DPI,作为手机的固定DPI,如表(1)

                               表(1)

密度ldpimdpihdpixhdpixxhdpi
密度值120160240320480
分辨率240*320320*480480*800720*12801080*1920

三、独立像素密度dp

正是由于各种屏幕密度不同,导致同样像素大小的长度,在不同密度的屏幕上显示长度不同。因为相同长度的屏幕,高密度的屏幕包含更多的像素点。Android系统使用mdpi即密度值为160的屏幕作为标准,在屏幕上1px = 1dp。其他屏幕则可以通过比例进行换算,例如同样是1100dp的长度,在mdpi中为100px,而在hdpi中为150px。我们也可以得出在各个密度值中的换算公式,在mdpi中1dp = 1px,在hdpi中1dp = 1.5px,在xhdpi中1dp = 2px,在xxhdpi中1dp = 3px。因此我们也可以得到各个分辨率直接的换算比例,即ldpi:mdpi:hdppi:xhdpi:xxhdpi=3:4:6:8:12。

四、单位转换

在程序中,可以非常方便地对这些单位进行转换。下面的代码给出了一种转换的方法,我们可以把这些代码作为工具类保存到项目中。

/**
 * 作用:dp、sp转换为px的工具类
 * 
 * 
 */
public class DisplayUtil {
    /**
     * 将px值转换为dip或dp值,保证尺寸大小不变
     * @param context
     * @param pxValue
     *                 (DisplayMetrics类中的属性density)
     * @return
     */
    public static int px2dip(Context context,float pxValue){
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int)(pxValue/scale+0.5f);
    }

    /**
     * 将dip或dp转换为px值,保证尺寸大小不变
     * @param context
     * @param dipValue
     *                  (DisplayMetrics类中的属性density)
     * @return
     */
    public static int dip2px(Context context,float dipValue){
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int)(dipValue*scale+0.5f);
    }

    /**
     * 将px值转换为sp值,保证文字大小不变
     * @param context
     * @param dipValue
     *                  (DisplayMetrics类中的属性scaledDensity)
     * @return
     */
    public static int px2sp(Context context,float dipValue){
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int)(dipValue/fontScale+0.5f);
    }

    /**
     * 将px值转换为sp值,保证文字大小不变
     * @param context
     * @param dipValue
     *                  (DisplayMetrics类中的属性scaledDensity)
     * @return
     */
    public static int px2px(Context context,float dipValue){
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int)(dipValue*fontScale+0.5f);
    }
}

其中density就是前面说说的转换比例。这里使用的是公式换算方法进行转换。同时,系统也提供了TypedValue类帮助我们转换,代码如下所示。

    /**
     * dp2px
     * @param context
     * @param dp
     * @return
     */
    protected int dp2px(Context context,int dp){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,context.getResources().getDisplayMetrics());
    }

    /**
     * sp2px
     * @param context
     * @param sp
     * @return
     */
    protected int sp2px(Context context,int sp){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,sp,context.getResources().getDisplayMetrics());
    }

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值