博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
头条Android 屏幕适配
阅读量:6949 次
发布时间:2019-06-27

本文共 2364 字,大约阅读时间需要 7 分钟。

android中的dp在渲染前会将dp转为px,计算公式:

px = density * dp;

density = dpi / 160;

px = dp * (dpi / 160);

dpi = √widthpix widthpix + heightpix heightpix / 尺寸大小

android中所有的dp和px的转换都是通过 DisplayMetrics 中相关的值来计算的

假设设计图宽度是360dp,以宽维度来适配。

那么适配后的 density = 设备真实宽(单位px) / 360,接下来只需要把我们计算好的 density 在系统中修改下即可

public class ScreenAdapter {    private float sNonCompatDensity;    private float sNonCompatScaledDensity;    /**     * 假如:设计图是使用宽度为360dp设计     * 布局中就可以直接使用360dp宽度大小去设计     * 适配后的 density = 设备真实宽(单位px) / 360,接下来只需要把我们计算好的 density 在系统中修改下即可     * @param modelDpSize 设计模版宽dp大小     */    private void setCustomDensity(final Application application, int modelDpSize) {        final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();        if (sNonCompatDensity == 0) {            sNonCompatDensity = appDisplayMetrics.density;            sNonCompatScaledDensity = appDisplayMetrics.scaledDensity;            //监听系统字体切换            application.registerComponentCallbacks(new ComponentCallbacks() {                @Override                public void onConfigurationChanged(Configuration newConfig) {                    if (newConfig != null && newConfig.fontScale > 0) {                        sNonCompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;                    }                }                @Override                public void onLowMemory() {                }            });        }        //density = px / dp        final float targetDensity = appDisplayMetrics.widthPixels / modelDpSize;        //不能直接用原始的scaledDensity,直接用的话可能导致某些文字超过显示区域,        //因此我们可以通过计算之前scaledDensity和density的比获得现在的scaledDensity        final float targetScaleDensity = targetDensity * (sNonCompatScaledDensity / sNonCompatDensity);        //density = dpi / 160;        final int targetDensityDpi = (int) (targetDensity * 160);        appDisplayMetrics.density = targetDensity;        appDisplayMetrics.scaledDensity = targetScaleDensity;        appDisplayMetrics.densityDpi = targetDensityDpi;        final DisplayMetrics activityDisplayMetrics = application.getResources().getDisplayMetrics();        activityDisplayMetrics.density = targetDensity;        activityDisplayMetrics.scaledDensity = targetScaleDensity;        activityDisplayMetrics.densityDpi = targetDensityDpi;    }}

转载于:https://blog.51cto.com/xuguohongai/2286440

你可能感兴趣的文章
想要成为python大神,这17个老司机收藏的国外免费学习网站不可错过!
查看>>
选型 - QA testing tools 2/26/2016
查看>>
Linux培训大纲
查看>>
X3-02 gprs 设置
查看>>
列出对像属性,for(var i in obj)[转]
查看>>
Js(DOM) 和Jq 对象的相互转换
查看>>
HDUOJ3980取模运算
查看>>
20165318 2017-2018-2 《Java程序设计》第九周学习总结
查看>>
mysql 数据库备份的多种方式
查看>>
2-范数、1-范数、···
查看>>
C#闭包函数
查看>>
浅谈vr基础视频教程 改变技术革命
查看>>
c++调用DOS命令,不显示黑屏
查看>>
python虚拟环境
查看>>
ls -l 各项含义
查看>>
Helios与Katana的区别
查看>>
python从数据库取数据后写入excel 使用pandas.ExcelWriter设置单元格格式
查看>>
Android JPush(极光推送)的使用教程
查看>>
奇异值分解(SVD)小结
查看>>
MYSQL数据库设计规范
查看>>