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开发有所帮助。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/243157.html
微信扫一扫
支付宝扫一扫