头条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(),所以直接在这里进行适配

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 广东中山电信DNS地址 (铁通/网通)

    广东中山电信DNS地址 (铁通/网通)202.96.128.166202.96.128.86202.96.134.133 总忘,先记在这儿吧==============================广东各宽带运营商DNS列表==============================广东电信新DNS域名办事器共分3个地区:  1.中国电信广州地区用户(增城、番禺、从化等区的电信用户也包括在内)

    2022年7月11日
    91
  • idea 2021.7激活码【永久激活】

    (idea 2021.7激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月20日
    262
  • pycharm里为啥运行不了pip_error loading package list:pypi

    pycharm里为啥运行不了pip_error loading package list:pypi安装好了python以及pycharm,添加pysql时,第一次出现错误是pip版本不匹配,当前版本是9.0.1,需要更新至版本。更新版本需要找到easy_install.exe,在终端中执行:pipinstallpip–upgrade即可首先终端可用快捷键win+R打开,输入“cmd”,由于我的python是2.7版本,安装在D盘,输入“D:”,按enter键,继续输入“cdp…

    2022年8月27日
    3
  • Java Web项目 图书管理系统「建议收藏」

    Java Web项目 图书管理系统「建议收藏」版权声明:本文为博主原创文章,未经博主允许不得转载2019.5.22更新看到很多人看这个项目我也没想到,不过我现在不在CSDN写文章了,博客地址链接←这是我的博客地址链接GitHub地址链接←这是我的github地址链接里面有我学习Java的过程以及笔记,希望大家一起交流。由于刚刚学习完JSP和Servlet在学习框架之前下你给更加巩固一下前面的知识所以写…

    2022年7月13日
    19
  • 制作动态头像_取网名独一无二的

    制作动态头像_取网名独一无二的制作一个炫酷的svg动态头像,闪瞎技术人的双眼吧

    2022年8月16日
    8
  • 开复网好文转载—————-跟踪自己一周

    开复网好文转载—————-跟踪自己一周来源:http://www.5xue.com/modules/bbs/viewthread.php?tid=212302自己跟踪自己一周亲爱的,你是如何喂养你的大脑的呢?如果,你不能每天为你的梦

    2022年6月30日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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