头条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)
blank

相关推荐

  • js的onchange(js replace函数)

    jsonpropertychange函数当一个HTML元素的属性用js改变的时候,都能通过onpropertychange来捕获。例如一个<inputname=”text1″id=”text1″/>对象的value属性被页面的脚本修改的时候,onchange无法捕获到,而onpropertychange却能够捕获。也就是说:onpropertychange事…

  • 邻接矩阵与关联矩阵「建议收藏」

    邻接矩阵与关联矩阵「建议收藏」【邻接矩阵】定义:设无向图G=(V,E)G=(V,E)G=(V,E),其中顶点集V=v1,v2,…,vnV=v1,v2,…,vnV={v_1,v_2,…,v_n},边集E=e1,e2,…,eεE=e1,e2,…,eεE={e_1,e_2,…,e_\varepsilon}。用aijaija_{ij}表示顶点viviv_i与顶点vjvjv_j之间的边数,可能取值为0,1…

    2022年10月29日
  • 用testNG测试,可以做简单的并发测试

    用testNG测试,可以做简单的并发测试

  • WinAPI CreateThread

    WinAPI CreateThreadHANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);编辑本段参数说明…

  • android短信验证码方案,Android之短信验证码

    android短信验证码方案,Android之短信验证码今天所使用的方案只是android手机设备集成短信验证码功能的方案之一。我们所采用的方案是使用聚合数据的短信验证sdk。接口文档:https://www.juhe.cn/docs/api/…程序的界面如下所示:实现步骤:1.到聚合数据官网上申请短信验证SDK数据,生成AppKey,如下图所示:2.配置工程,把相关的sdk库导入到Project中去,:3.配置AndroidManifest.xm…

  • ORM学员管理系统单表查询示例

    前期准备工作首先创建好一个项目一:必须使用MySQL创建一个库因为ORM只能对表和数据进行处理,所以库必须自己创建二:进行相关的配置一:二:三:四:五:三创建表必须注意一下俩点

发表回复

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

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