头条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)
上一篇 2022年6月1日 下午8:46
下一篇 2022年6月1日 下午8:46


相关推荐

  • 数据挖掘应用实例分析

    数据挖掘应用实例分析数据挖掘应用实例分析——个性化推荐系统​ 数据挖掘技术,一门基于计算机技术与大数据时代信息处理需求的技术产物,从世纪之交的火热发展以来,不知不觉间,早已应用到我们生活的方方面面:电子邮箱中的垃圾邮件分类、电影院的票房预测、网页上的广告推荐、语音识别、电网语义精确搜索等。还有人工智能、自然语言处理、数据修正等。我们认为,数据挖掘技术将成为互联网时代应用最广泛的技术之一,它有可能为人类社会带来一个新的时代。​ 但是由于笔者才疏学浅,今天我们暂不谈得那么高深,只分析的一个常见的应用实例——个性化推荐系统。

    2022年6月15日
    33
  • ubuntu安装Microsoft Edge并设置为中文

    ubuntu安装Microsoft Edge并设置为中文1.Linux版本的Edge两种安装方式:下载.deb安装官方下载网址MicrosoftEdgeInsiderChannelssudodpkg-imicrosoft-edge-dev_91.0.864.1-1_amd64.deb命令行安装##Setupcurlhttps://packages.microsoft.com/keys/microsoft.asc|gpg–dearmor>microsoft.gpgsudoinstall-oroo

    2022年7月21日
    25
  • 树莓派安装和使用Pycharm

    树莓派安装和使用Pycharm树莓派安装中文输入法很多教程都说 安装中文输入法需要更新字体 但是我发现 最新版本的树莓派是不需要这个操作的 可以直接安装输入法 在终端中输入命令 sudoapt getinstallfc googlepinyin module cloudpinyinf sunpinyin 还有一点待查的是 似乎现在国内使用树莓派也不需要更换源了 树莓派会自动选

    2026年3月27日
    3
  • python attrs_Python attrs作用是什么?

    python attrs_Python attrs作用是什么?fromrest_frameworkimportserializersclassCommentSerializer(serializers.Serializer):email=serializers.EmailField()content=serializers.CharField(max_length=200)created=serializers.DateTimeField…

    2022年10月18日
    5
  • 腾讯云消息队列CMQ

    腾讯云消息队列CMQ消息队列 CMQ 版 TDMQforCMQ 简称 TDMQCMQ 版 是一款分布式高可用的消息队列服务 它能够提供可靠的 基于消息的异步通信机制 能够将分布式部署的不同应用 或同一应用的不同组件 中的信息传递 存储在可靠有效的 CMQ 队列中 防止消息丢失 TDMQCMQ 版支持多进程同时读写 收发互不干扰 无需各应用或组件始终处于运行状态 相比传统开源 MQ 应用腾讯云消息队列 CMQ 优势有哪些 高性能 兼顾性能与可靠性 单 TDMQCMQ 版实例 QPS 达到 5000 高扩展性 1 队列数量及队

    2026年3月17日
    1
  • mac pycharm2021.11.3激活_在线激活

    (mac pycharm2021.11.3激活)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~3MRUAPM31O-eyJsaWNlbnNlSWQiOi…

    2022年3月29日
    106

发表回复

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

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