首页 > 编程知识 正文

屏幕密度和屏幕像素密度区别,android 10适配

时间:2023-05-04 14:07:05 阅读:59845 作者:4135

说明:本文只是一个简单的思路,没有实现项目的车轮

通过修改系统像素密度实现屏幕拟合的主要思路是:

通过更改density、scaleDensity和dpi的值,可以在系统内部的

相对于目标大小的像素密度。 达到画面匹配的目的。

名词解释:

density:表示屏幕为1英寸的像素点/160的比率。 如果屏幕在1英寸范围内有160个像素点,则density=1;如果屏幕在1英寸范围内有320个像素点,则density=2

其中,xx英寸通常是指屏幕对角线的长度

scaleDensity:表示字体的缩放比例,缺省scaleDensity=density

densityDpi:表示屏幕上每英寸的像素点数,与上面的160、320相同

在Android中,控件在屏幕上显示的大小最终转换为以像素为单位,即px。 (无论用xml声明的dp、pt和sp如何,最终都将转换为像素px。 )

在Android xml中声明的大小单位由TypedValue类的applydimension(intunit、float value和display metrics )方法转换,如下所示

publicstaticfloatapplydimension (intunit,float value,

显示测量结果)

{

交换机(单元) {

case COMPLEX_UNIT_PX:

返回值;

case COMPLEX_UNIT_DIP:

return value * metrics.density;

case COMPLEX_UNIT_SP:

return value * metrics.scaled density;

case COMPLEX_UNIT_PT:

返回值* metrics.xdpi * (1.0f/72;

case COMPLEX_UNIT_IN:

return value * metrics.xdpi;

case COMPLEX_UNIT_MM:

返回值* metrics.xdpi * (1.0f/25.4 f;

}

返回0;

}

从上面的代码中可以看到,更改显示度量的density和scaledDensity可以影响控件的最终像素值

Android碎片整理现象严重,density的值可能因设备而异,同一分辨率的设备的density的值也可能不同,因此调整或优化density的值进行处理是Android的画面匹配方案

我们期望的是,density根据画面的分辨率而变化,也就是说是相同分辨率的设备,因此density的值优选相同

这种思路实现的屏幕拟合比较全面,下面粘贴代码,使用时直接在Activity的setContentView ()方法前调用即可density.setdensity )、getapplication

或者在应用程序中注册、注册、注册、生命周期(newactivitylifecyclecallbacks (newactivitylifecyclecallbacks ) ) ) )进行活动创建回调方法在onactivitycreated bundle savedinstancestate中调用density.set density (application.this,activity )

公共类隔离{

私密性统计信息流程宽度=320; //参考机器的宽度、单位为dp 320/2=160

私有静态浮动应用程序确定性; //表示屏幕密度

隐私保护功能; //字体缩放,默认appDensity

公共服务语音设置(finalapplicationapplication,Activity activity ) {

//取得当前APP的画面显示信息

displaymetricsdisplaymetrics=application.get resources ().getDisplayMetrics );

if(appdensity==0) {

//初始化赋值操作

app density=display metrics.density;

appscaledensity=display metrics.scaled density;

//添加字体更改拦截回调

application.registercomponentcallbacks (newcomponentcallbacks () ) {

@Override

publicvoidonconfigurationchanged (配置网络配置) {

//字体发生变化,重新为scaleDensity赋值

新配置!=null newConfig.fontScale 0) {

appscaledensity=application.get resources (.getdisplaymetrics ).scaledDensity;

}

}

@Override

公共语音在线存储器

}

);

}

//计算目标值density、scaleDensity、densityDpi

floattargetdensity=display metrics.width pixels/width; //1080/360=3.0

floattargetscaledensity=target density * (appscaledensity/app density );

inttargetdensitydpi=(int ) ) targetDensity * 160;

替换活动的density、scaleDensity和densityDpi

displaymetricsdm=activity.get resources (.getdisplaymetrics );

dm.density=targetDensity;

DM.scaled density=targetscaledensity;

dm.densityDpi=targetDensityDpi;

}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。