Android屏幕适配之修改系统density
16lz
2021-01-23
今日头条屏幕适配思路
Android中xml布局文件中写的是什么单位最终会转化成px
android.util.TypedValue#applyDimension
public static float applyDimension(int unit, float value, DisplayMetrics metrics) { switch (unit) { case COMPLEX_UNIT_PX: //px return value; case COMPLEX_UNIT_DIP: //dp * density return value * metrics.density; case COMPLEX_UNIT_SP: //sp * scaledDensity return value * metrics.scaledDensity; case COMPLEX_UNIT_PT: return value * metrics.xdpi * (1.0f/72); case COMPLEX_UNIT_IN: return value * metrics.xdpi; case COMPLEX_UNIT_MM: return value * metrics.xdpi * (1.0f/25.4f); } return 0; }
我们在开发过程中,主要用px、dip、sp这三种单位比较多一些
dip = value * metrics.density;
通过上面返回值可以发现 dip = value * DisplayMetrics.density
如果能把DisplayMetrics里面的density常量值进行修改,不就可以在不用分辨率手机缩放显示一样的效果。
实现
我的手机宽度是720px,宽度是360dp
case COMPLEX_UNIT_DIP: return value * metrics.density;
如果ui给出设计图总宽度为 360 dp,那么如果有一个控件在设计图上的宽为180dp、高为180dp那么这个控件宽度占整个设计图宽度的一半 (180 / 360 = 0.5)
(dp * density = px)
系统最后将高宽dp都换算成 px,180dp * 2 = 360px
public class Density { //ui参考设备的宽,dp private static final float WIDTH = 360; private static float appDensity; public static void setDensity(final Application application, Activity activity) { DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics(); if (appDensity == 0) { appDensity = displayMetrics.density; } //计算目标值density,densityDpi float targetDensity = displayMetrics.widthPixels / WIDTH; int targetDensityDpi = (int) (targetDensity * 160); DisplayMetrics dm = activity.getResources().getDisplayMetrics(); dm.density = targetDensity; dm.densityDpi = targetDensityDpi; }}
验证
720* 1080分辨率手机 density = 2
1080*1920分辨率手机 density=3
今日头条屏幕适配方案
更多相关文章
- Android 处理屏幕解锁和设置锁屏密码
- Activity 技巧 屏幕 进度条 控制
- android上,实现直接在屏幕上显示点击位置,方便调试。
- android获取手机信息以及服务商信息
- JS判断客户端是否是iOS或者Android手机移动端
- 2010.12.26——— android 获得手机号码 和 IMEI号 等
- android 设置系统屏幕亮度