• android计算屏幕dp


    首先我们来了解一些基本元素:

    px:像素,屏幕上的点。

    dpi:一英寸长的直线上的像素点的数量,即像素密度。标准值是160dp。

    /**
    * 正是因为dpi值其代表的特性,所以android项目的资源文件下存在以下目录:
    drawable-ldpi ( 当dpi为120时,使用此目录下的资源)
    drawable-mdpi ( 当dpi为160时,使用此目录下的资源)
    drawable-hdpi ( 当dpi为240时,使用此目录下的资源)
    drawable-xhdpi ( 当dpi为320时,使用此目录下的资源)
    drawable-xxhdpi ( 当dpi为480时,使用此目录下的资源)
    Android正是根据设备DPI值得不同,选择清晰度不同的资源使用,完成屏幕的适配。
    */

    dp(dip):独立像素密度。即在标准屏幕下,1个像素点的长度,标准屏幕是160dpi,可以理解为1英寸长度上有160个像素。标准屏幕中1dp=1px。

    px(像素) = dp(独立像素密度) * (dpi(像素密度) / 160)

    分辨率:屏幕上长宽方向上像素点的数量,即一个屏幕上像素的数量。

        例如:720*1280 = 屏幕x轴上有720个像素,屏幕y轴上有1280个像素

    分辨率单位:dpi(点每英寸)、lpi(线每英寸)、ppi(像素每英寸)

    屏幕的物理尺寸:屏幕对角线的长度,单位是inch

    sp:专用于设定文字大小,受dpi影响和用户的字体偏好设定影响。

    下面我们来计算屏幕dp:

    1    DisplayMetrics metrics = new DisplayMetrics();
    2     getWindowManager().getDefaultDisplay().getMetrics(metrics);
    3         int screenHeight = metrics.heightPixels;//屏幕高度像素
    4         int screenWidth = metrics.widthPixels;//屏幕宽度像素
    5         //density = densityDpi / 160
    6         float density = metrics.density;// "屏幕密度"(0.75 / 1.0 / 1.5)
    7         int densityDpi = metrics.densityDpi;// 屏幕密度dpi(120 / 160 / 240)每一英寸的屏幕所包含的像素数.值越高的设备,其屏幕显示画面的效果也就越精细
    8         // 屏幕宽度算法:屏幕宽度(像素)/"屏幕密度"   px = dp * (dpi / 160)
    9         int height = (int) (screenHeight / density);//屏幕高度dp

     但是,需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。比如说,一部240x320像素的低密度手机,如果运行上述代码,获取到的屏幕尺寸是320x427。因此,研究之后发现,若没有设定多分辨率支持的话,Android系统会将240x320的低密度(120)尺寸转换为中等密度(160)对应的尺寸,这样的话就大大影响了程序的编码。所以,需要在工程的AndroidManifest.xml文件中,加入supports-screens节点,具体的内容如下:

    1 <!-- 得到屏幕正常的物理尺寸 -->
    2     <supports-screens
    3         android:anyDensity="true"
    4         android:largeScreens="true"
    5         android:normalScreens="true"
    6         android:resizeable="true"
    7         android:smallScreens="true" />

    这样的话,当前的Android程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了。

  • 相关阅读:
    在C#中子线程如何操作主窗口线程上的控件
    创建数据透视表数据包含合并单元格
    sql,nosql
    Enthought科学计算,数据分析
    程序员常去的14个顶级开发社区
    Windows查看进程taskList,终止进程tskill
    Pandas库之DataFrame
    centos下chm阅读器
    c++回调函数
    __NSAutoreleaseNoPool(): ... utoreleased with no pool in place
  • 原文地址:https://www.cnblogs.com/cbx17v/p/7156209.html
Copyright © 2020-2023  润新知