您的位置:

深入剖析Android中的displaymetrics

Didi Chuxing在其开源的Android框架中,提供了一些非常实用的公共类和工具类,其中有一个叫做DisplayMetrics的类,我们今天就来深入剖析这个类的使用。

一、DisplayMetrics是什么?

在Android中,DisplayMetrics是一个结构体,主要用于描述显示设备的一些物理特性,包括显示区域的大小、密度、字体缩放比例等。

更具体地说,DisplayMetrics类中有以下属性:

    /**
     * The absolute width of the display in pixels.
     */
    public int widthPixels;

    /**
     * The absolute height of the display in pixels.
     */
    public int heightPixels;

    /**
     * The exact physical pixels per inch of the screen in the X dimension.
     */
    public float xdpi;

    /**
     * The exact physical pixels per inch of the screen in the Y dimension.
     */
    public float ydpi;

    /**
     * The logical density of the display.
     */
    public float density;

    /**
     * The screen density expressed as dots-per-inch.
     */
    public int densityDpi;

    /**
     * A scaling factor for fonts displayed on the display.
     */
    public float scaledDensity;

    /**
     * The absolute width of the available display size in pixels.
     */
    public int widthPixelsInner;

    /**
     * The absolute height of the available display size in pixels.
     */
    public int heightPixelsInner;

大多数属性名都比较直观,这里提一下density,它是指当前屏幕的逻辑密度,单位是dpi,在160dpi(即mdpi)的屏幕上,density的值为1,而在每个精度/密度分类中,都有相应的density标准值。例如,在240dpi(即hdpi)的屏幕上,density的值为1.5。

二、如何获取DisplayMetrics?

获取DisplayMetrics非常简单,只需要调用android.content.Context类的getResources()方法获取Resource对象,然后再通过Resource对象的getDisplayMetrics()方法获取DisplayMetrics即可,代码如下:

    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getResources().getDisplayMetrics();

需要注意的是:

1、getDisplayMetrics()方法只能在Activity、FragmentActivity、Service等有上下文的类中调用。

2、如果你的应用程序跨越多个屏幕密度分类,你应该再加上一个获取Configuration对象的步骤(详见下一节)。

三、如何根据屏幕大小和密度适配应用程序?

在Android开发中,要确保应用程序可以在各种屏幕密度和屏幕大小下被合理地显示,那么我们就需要用到布局文件中的单位和像素密度。

具体来讲,Android的屏幕密度有四种等级:ldpi(低)、mdpi(中)、hdpi(高)和xhdpi(超高),分别对应的dpi值为120、160、240和320。

可以使用px(像素)作为单位,但是几乎是不可取的,因为每个设备的像素密度不同,布局界面会因屏幕大小不同而出现不必要的拉伸或缩小。

在布局文件中,最好使用dp(dip)作为单位,并在代码中动态地设置各种组件的属性。例如:

    TextView tv = findViewById(R.id.tv_hello);
    ViewGroup.LayoutParams params = tv.getLayoutParams();
    params.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
    params.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());
    tv.setLayoutParams(params);

这里,我们使用了TypedValue类的applyDimension()方法将100dp和50dp转化为了不同屏幕密度下的像素值,然后将其分别作为宽和高设置到TextView上。

此外,还可以使用其他的单位,例如sp、mm等,它们的转化方法和dp基本一致。

四、如何根据屏幕方向适配应用程序?

有时候,我们还需要根据屏幕的方向(横屏/竖屏)来适配应用程序的界面表现。

在Android中,使用Configuration类来判断当前屏幕方向是非常方便的,代码如下:

    Configuration configuration = getResources().getConfiguration();
    if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE){
        //横屏
    }else{
        //竖屏
    }

然后,你可以根据屏幕方向对布局界面进行调整来适应横、竖屏的显示要求。

五、如何根据屏幕尺寸适配应用程序?

除了屏幕密度、屏幕方向之外,有时候我们还需要根据屏幕的实际尺寸来适配应用程序的界面表现。

在Android中,使用DisplayMetrics的heightPixels和widthPixels属性获取当前屏幕的宽和高,代码如下:

    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int screenHeight = metrics.heightPixels;
    int screenWidth = metrics.widthPixels;

然后,你可以根据屏幕的宽和高对布局界面进行调整来适应屏幕的实际尺寸。

六、小结

本文通过深入剖析Android中的displaymetrics,从获取DisplayMetrics、根据屏幕密度和屏幕大小适配应用程序、根据屏幕方向适配应用程序、根据屏幕尺寸适配应用程序等多个方面阐述了DisplayMetrics的使用方法,并给出了相应的代码示例,希望本文对你的Android开发有所帮助。

深入剖析Android中的displaymetrics

2023-05-19
印象笔记记录java学习(Java成长笔记)

2022-11-12
Android中dp与px的转换方法

一、什么是dp和px 在Android开发中,dp和px都是用来描述屏幕上的尺寸的单位,但它们之间有很大的区别。px是像素,dp(Density-independent Pixels)也称dip,是与

2023-12-08
java学习笔记(java初学笔记)

2022-11-14
python基础学习整理笔记,Python课堂笔记

2022-11-21
深度剖析Android中的LayoutParams

2023-05-17
java笔记,大学java笔记

2022-11-28
java方法整理笔记(java总结)

2022-11-08
重学java笔记,java笔记总结

2022-11-23
java笔记,尚硅谷java笔记

2022-12-01
Android开发:获取屏幕尺寸的方法

在Android开发中,我们经常需要获取设备的屏幕参数,比如尺寸、分辨率等。而获取屏幕尺寸则是其中的一个重要步骤。在本文中,我们将介绍如何在Android开发中获取设备屏幕尺寸的方法。具体而言,我们将

2023-12-08
提高Android应用安全性的有效工具-网络数据包分析

2023-05-14
全面解析屏幕适配方案ScreenMatch的实现原理

2023-05-17
深入剖析Python中的pool_size

2023-05-20
数据库的笔记mysql,数据库管理系统笔记

2022-11-24
java基础知识学习笔记一,Java基础笔记

2022-11-21
我的python笔记06(Python)

2022-11-14
我的ipynb笔记本

2023-05-10
深入剖析AD域管理工具

2023-05-20
python的用法笔记本(笔记本学python)

2022-11-16