头条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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python中常用的第三方库_vscode如何使用第三方库

    Python中常用的第三方库_vscode如何使用第三方库第10章Python第三方库使用1.Python第三方库的获取和安装1.1pip工具安装1.2自定义安装1.3文件安装1.4pip工具使用2.pyinstaller库概述3.pyinstaller库与程序打包4.jieba库概述5.jieba库与中文分词6.wordcloud库概述7.wordcloud库与可视化词云1.Python第三方库的获取和安装Python第三方库依照安装方式灵活性和难易程度有3个方法,这3个方法是:pip工具安装、

    2022年10月14日
    3
  • 芯片行业未来_为什么中国没有自己的芯片架构

    芯片行业未来_为什么中国没有自己的芯片架构【CSDN编者按】随着设备扩展带来的效益越来越少,人们开始设计内置AI的系统,以在本地处理更多数据。芯片制造商正在研究一种新的结构,这种结构能够显著增加每能耗和每个时钟周…

    2025年9月29日
    2
  • Java的三种注释

    Java的三种注释Java基础是java初学者的起点,是帮助你从小白入门到精通必学基础课程!为初学者而著!Java300集>>>适合准备入行开发的零基础员学习Java,基于最新JDK13、IDEA平台讲解的,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。配套学习:Java初学者入门教程>>>Java注释:单行、多行和文档注释注释是对程序语言的说明,有助于开发者和用户之间的交流,方便理…

    2022年7月7日
    20
  • 大数据常见错误及解决方案[通俗易懂]

    大数据常见错误及解决方案[通俗易懂]大数据常见错误及解决方案(转载)1、用./bin/spark-shell启动spark时遇到异常:java.net.BindException:Can’tassignrequestedaddress:Service‘sparkDriver’failedafter16retries!解决方法:addexportSPARK_LOCAL_IP=“127.0.0.1”tospark-env.sh2、javaKafkaproducererror:ERRORkafka.util

    2022年6月2日
    159
  • 手机怎么访问电脑服务器上的网页

    手机怎么访问电脑服务器上的网页

    2021年9月23日
    45
  • jmeter性能测试方案

    jmeter性能测试方案性能测试方案性能测试概述性能测试是通过自动化的测试工具模拟多种正常 峰值以及异常负载条件来对系统的各项指标进行测试 测试前期准备 1 测试需求 1 1 需要将开发给定的需求 前端页面的智能问答接口性能 转为吞吐量和响应时间 1 2 根据测试目的 细化需求 2 测试准备 测试准备包括测试客户端机器准备 测试数据准备 测试脚本准备 3 测试执行 测试的执行中 需要监控测试客户端和服务器性能 监控服务器端应用情况 1 3 1 客户端的系统资源 cpu io memory 情况 1

    2025年6月6日
    4

发表回复

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

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