Android屏幕适配 - 百分比(二)

本文探讨了Android屏幕适配的百分比解决方案,特别是针对Android 7.0及以上版本的屏幕缩放功能。通过hook系统单位density,在onCreate和onConfigurationChanged回调中调整density值,实现全局适配。实验表明,这种方法可以有效实现屏幕百分比适配,降低业务成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着上一篇:Android屏幕适配 - 百分比(一)

既然我们能通过更改pt这个系统单位做到,拿为什么我们不能直接修改dp呢?

方案二:直接替换系统单位dp

上一篇我们有具体分析,只要修改这个方法的pt转化就可以做到全局适配,同样修改这个方法里面的dp也能做的。


我们看到value * metrics.density,所以如果直接修改dp我们需要hook掉的其实是density。

这个理论上看是ok的,dp转换到px就是由density的值决定的。

那么density的这个值是从哪里获取过来的呢? 会不会有时机会修改掉这个值呢?hook掉这个的时机是什么呢?




默认的density取自于系统文件 qemu.sf.lcd_density 或 ro.sf.lcd_density 中。

通过adb shell getprop ro.sf.lcd_density 命令,我能获取到手机的density值


默认的density是这么获取到的。

那会不会有时机会修改掉这个值呢?

是的,有,在7.0系统以上手机支持了 屏幕缩放可以调整的功能。


以华为P9 plus为例,我们把显示模式调整为中,这时候我们写demo,在activity的onCreate的时机获取的density值


这里的densityDpi对应的是我们上面说的设备的density,可以看到从480变成了440.

我们发现density会随着屏幕缩放大小调节变化。

细心的朋友会发现我们上面的打印了两种获取density的方式,getResource和Window。

我们具体说明下:

获取density的两种方式:

1. WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
 DisplayMetrics outMetrics = new DisplayMetrics();
 wm.getDefaultDisplay().getMetrics(outMetrics);
2. DisplayMetrics displayMetrics = getResources().getDisplayMetrics();

两种方式的区别:

在双屏显示的时候调整屏幕大小时,第一种方式密度值是不实时生效的,所以我们舍弃第一种获取density的方式。



在双屏模式下,屏幕缩放调大后,我们看到application中的window的获取density的方式的值是没有实时生效变化的。

所以舍弃这种获取方式。

看到调节系统屏幕大小时候density会变化,我们hook掉density的时机就要在这个之后。


详细见官网地址:https://developer.android.com/about/versions/nougat/android-7.0-changes.html

既然是按照运行时更改处理,是不是可以理解为一定会走到这个生命周期

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d("MyApplication", "onConfigurationChanged");
    }

我们demo实际验证下:

实际检验,在调节屏幕大小和字体大小的时候都会回调到,那是不是说,我们只要在Application的onCreate中和onConfigurationChanged中修改resource方式的density的值就可以做到全局适配呢?


我们惊喜的发现是的,能够做到全局适配,那是不是这样就能做到屏幕百分比适配,还最大限度解决了业务成本。

哈哈哈~有没有很惊喜~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值