头条AutoSize基本原理

头条AutoSize基本原理其实核心代码根简单,如下面显示,详情可以参考这个文章:屏幕适配:修改屏幕像素密度,随便设dpprivatefinalstaticfloatWIDTH=960;publicstaticvoidsetDensity(Applicationapplication,AppCompatActivityactivity){//获取当前app的屏幕显示信息DisplayMetricsdisplayMetrics=application.g

大家好,又见面了,我是你们的朋友全栈君。

先看下density与scaledDensity代表的是什么
在这里插入图片描述

原理是获取屏幕的真实尺寸,结合设计图的尺寸,计算出缩放比例,任何根据缩放比例计算并修改应用显示的Density
,其实核心代码根简单,如下面显示,详情可以参考这个文章:屏幕适配:修改屏幕像素密度,随便设dp

 private final static float WIDTH = 960;

    public static void setDensity(Application application, AppCompatActivity activity) { 
   
        //获取当前app的屏幕显示信息
        DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();

        float appDensity = displayMetrics.density;
        float appScaleDensity = displayMetrics.scaledDensity;

        //计算等比缩放后的density和scaleDensity
        //WIDTH相对于所有屏幕宽度都是相等的,它是用dp作为单位,所以 屏幕宽度/屏幕密度=WIDTH
        //targetDensity = targetWidht/WIDTH
        float targetDensity = displayMetrics.widthPixels / WIDTH;
        //appScaleDensity/appDensity=targetScaleDensity/targetDensity;
        float targetScaleDensity = targetDensity * (appScaleDensity / appDensity);
        int targetDensityDpi = (int) (targetDensity * 160);

        //替换activity的density,appdensity,densityDpi
        DisplayMetrics aDisplayMertics = activity.getResources().getDisplayMetrics();
        aDisplayMertics.density = targetDensity;
        aDisplayMertics.scaledDensity = targetScaleDensity;
        aDisplayMertics.densityDpi = targetDensityDpi;
    }

隐藏的坑

  • 不同像素密度设备下显示异常
    AutoSize原理
    (宽度)px = dp * density; 根据百分比适配的话, 如果设计稿给的是1080x1920,那么宽就为360dp,像素为1080px,density为3,占满100% 如果是在720x1280的话,360dp * density = 720,所以这个density为2,将density修改为2就可以了

假如设计图是1080×1920,那么宽就为360dp,像素为1080px,density为3。要计算的view为50%为540dp,假如设备的真实像素为10800×19200,density为1,根据上面的计算:

float appDensity = displayMetrics.density=1//真实屏幕密度
float targetDensity = displayMetrics.widthPixels / WIDTH=10800px/1080=10 //计算后的密度

因此使用了autoSize后,屏幕密度修改为了10,而不是真实的1。那么真实的view算出来就是540*10=5400px正确,但是屏幕的真实宽度却是10800dp x 10=108000,大了10倍!所以只有在设计图的密度与设备的真实密度一致的情况下才能使用这个方式适配。

其他方案

可以参考下这个适配方案:https://blankj.com/2018/12/18/android-adapt-screen-killer/
原理是在适配的 Activity 中重写下 getResources() 函数,因为每次 View 在变更尺寸时都会调用到 getResources(),所以直接在这里进行适配

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137531.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Xcode签名安装_手机编程app

    Xcode签名安装_手机编程appXcode4 无签名生成app程序1.修改/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS[SDK版本].sdk/SDKSettings.plist文件,将CODE_SIGNING_REQ

  • 频段划分_世界各国频段划分

    频段划分_世界各国频段划分电磁波频段的划分射频(300KHz-300MHz):包括LF,MF,HF,VHF微波(300MHz-3000GHz):包括UHF,SHF,EHF,PHF微波频段的划分波段频率范围/GHzUHF0.3-1.12L1.12-1.70LS170-2.60S2.60-3.95C3.95-5.85XC5.85-8.20X8.2…

  • visual studio ultimate2012产品密钥_win7正版永久激活密钥

    visual studio ultimate2012产品密钥_win7正版永久激活密钥VisualStudioUltimate2012静态激活密钥,可以试一下。RBCXF-CVBGR-382MK-DFHJ4-C69G8

    2022年10月14日
  • linux下杀死全部进程,linux下批量杀死进程[通俗易懂]

    linux下杀死全部进程,linux下批量杀死进程[通俗易懂]psaux|greppython|grep-vgrep|cut-c9-15|xargskill-15管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。下面说说用管道符联接起来的几个命令:“psaux”是linux里查看所有进程的命令。这时检索出的进程将作为下一条命令“greppython”的输入。“greppython”的输出结果是,所有含有关键…

  • pycharm上如何拉git代码_pycharm版本控制

    pycharm上如何拉git代码_pycharm版本控制pycharm设置git与deployment1、创建project2、vcs创建git目录,指向project目录3、添加git远程地址4、拉取对应分支代码即可5、设置deployment5.1设置SFTP5.2配置信息5.3设置远程服务器文件地址

  • 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

    机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾f作者:寒小阳&&龙心尘时间:2015年10月。出处:声明:版权所有,转载请注明出处,谢谢。手把手机器学习之逻辑回归应用——Kaggle泰坦尼克之灾1.引言先说一句,年末双十一什么的一来,真是非(mang)常(cheng)欢(gou)乐(le)!然后push自己抽出时间来写这篇blog的原因也非常简单:写完前两篇逻辑回归的介绍和各个角度理解之后,小伙伴们纷纷表示『好像很高级的样纸,

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号