说明:本文只是一个简单的思路,没有实现项目的车轮
通过修改系统像素密度实现屏幕拟合的主要思路是:
通过更改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;
}
}