一种极低成本的Android屏幕适配方式(今日头条适配)

Android屏幕适配 Android屏幕适配方案 阅读详情

在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高。虽然Android官方提供了dp单位来适配,但其在各种奇怪分辨率下表现却不尽如人意,因此下面探索一种简单且低侵入的适配方式。

传统dp适配方式的缺点

android中的dp在渲染前会将dp转为px,计算公式:

px = density * dp;
density = dpi / 160;
px = dp * (dpi / 160);

而dpi是根据屏幕真实的分辨率和尺寸来计算的,每个设备都可能不一样的。

屏幕尺寸、分辨率、像素密度三者关系

通常情况下,一部手机的分辨率是宽x高,屏幕大小是以寸为单位,那么三者的关系是:

在这里插入图片描述

举个例子:屏幕分辨率为:1920*1080,屏幕尺寸为5吋的话,那么dpi为440。

在这里插入图片描述

这样会存在什么问题呢?

假设我们UI设计图是按屏幕宽度为360dp来设计的,那么在上述设备上,屏幕宽度其实为1080/(440/160)=392.7dp,也就是屏幕是比设计图要宽的。这种情况下, 即使使用dp也是无法在不同设备上显示为同样效果的。 同时还存在部分设备屏幕宽度不足360dp,这时就会导致按360dp宽度来开发实际显示不全的情况。

而且上述屏幕尺寸、分辨率和像素密度的关系,很多设备并没有按此规则来实现, 因此dpi的值非常乱,没有规律可循,从而导致使用dp适配效果差强人意。

探索新的适配方式

梳理需求

首先来梳理下我们的需求,一般我们设计图都是以固定的尺寸来设计的。比如以分辨率1920px * 1080px来设计,以density为3来标注,也就是屏幕其实是640dp * 360dp。如果我们想在所有设备上显示完全一致,其实是不现实的,因为屏幕高宽比不是固定的,16:9、4:3甚至其他宽高比层出不穷,宽高比不同,显示完全一致就不可能了。但是通常下,我们只需要以宽或高一个维度去适配,比如我们Feed是上下滑动的,只需要保证在所有设备中宽的维度上显示一致即可,再比如一个不支持上下滑动的页面,那么需要保证在高这个维度上都显示一致,尤其不能存在某些设备上显示不全的情况。同时考虑到现在基本都是以dp为单位去做的适配,如果新的方案不支持dp,那么迁移成本也非常高。

因此,总结下大致需求如下:

  1. 支持以宽或者高一个维度去适配,保持该维度上和设计图一致;
  2. 支持dp和sp单位,控制迁移成本到最小。
找兼容突破口

从dp和px的转换公式 :px = dp * density
可以看出,如果设计图宽为360dp,想要保证在所有设备计算得出的px值都正好是屏幕宽度的话,我们只能修改 density 的值。

通过阅读源码,我们可以得知,density 是 DisplayMetrics 中的成员变量,而 DisplayMetrics 实例通过 Resources#getDisplayMetrics 可以获得,而Resouces通过Activity或者Application的Context获得。

先来熟悉下 DisplayMetrics 中和适配相关的几个变量:

  1. DisplayMetrics#density 就是上述的density
  2. DisplayMetrics#densityDpi 就是上述的dpi
  3. DisplayMetrics#scaledDensity 字体的缩放因子,正常情况下和density相等,但是调节系统字体大小后会改变这个值

那么是不是所有的dp和px的转换都是通过 DisplayMetrics 中相关的值来计算的呢?

首先来看看布局文件中dp的转换,最终都是调用 TypedValue#applyDimension(int unit, float value, DisplayMetrics metrics) 来进行转换:
在这里插入图片描述

这里用到的DisplayMetrics正是从Resources中获得的。

再看看图片的decode,BitmapFactory#decodeResourceStream方法:

在这里插入图片描述

可见也是通过 DisplayMetrics 中的值来计算的。

当然还有些其他dp转换的场景,基本都是通过 DisplayMetrics 来计算的,这里不再详述。因此,想要满足上述需求,我们只需要修改 DisplayMetrics 中和 dp 转换相关的变量即可。

最终方案

下面假设设计图宽度是360dp,以宽维度来适配。

那么适配后的 density = 设备真实宽(单位px) / 360,接下来只需要把我们计算好的 density 在系统中修改下即可,代码实现如下:
在这里插入图片描述

同时在 Activity#onCreate 方法中调用下。代码比较简单,也没有涉及到系统非公开api的调用,因此理论上不会影响app稳定性。

于是修改后上线灰度测试了一版,稳定性符合预期,没有收到由此带来的crash,但是收到了很多字体过小的反馈:

在这里插入图片描述

原因是在上面的适配中,我们忽略了DisplayMetrics#scaledDensity的特殊性,将DisplayMetrics#scaledDensity和DisplayMetrics#density设置为同样的值,从而某些用户在系统中修改了字体大小失效了,但是我们还不能直接用原始的scaledDensity,直接用的话可能导致某些文字超过显示区域,因此我们可以通过计算之前scaledDensity和density的比获得现在的scaledDensity,方式如下:
在这里插入图片描述

但是测试后发现另外一个问题,就是如果在系统设置中切换字体,再返回应用,字体并没有变化。于是还得监听下字体切换,调用 Application#registerComponentCallbacks 注册下 onConfigurationChanged 监听即可。

因此最终方案如下:
在这里插入图片描述

当然以上代码只是以设计图宽360dp去适配的,如果要以高维度适配,可以再扩展下代码即可。

Showcase

适配前后和设计图对比:
在这里插入图片描述

适配后各机型的显示效果:
在这里插入图片描述

AndroidAutoSize实战教程:今日头条屏幕适配方案详解 通过 AndroidAutoSize 库来实现屏幕适配,确保在不同的屏幕尺寸、分辨率、密度下,应用界面和广告(如果涉及)能正常显示,特别是在字体、布局、图标等方面的适配。今日头条的屏幕适配方案,如果项目需求不涉及横竖屏切换,且不需要做平板适配,AndroidAutoSize 方案有一定的适用性,尤其是在应对多种屏幕尺寸和密度的情况下。AutoSize 会自动处理不同屏幕密度的适配,确保你的应用在 hdpi、mdpi、xhdpi 等不同的屏幕密度下能够正常显示。单位,这样可以确保字体在不同设备上适配。 阅读详情

相关推荐

Android屏幕适配方案总结

一、基础知识 1.Android中常用的距离单位 px(像素):每个px对应屏幕上的一个点。 dip或dp:(device independent pixels,设备独立像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dip=1px.单随着屏幕的密度改变,dip和px的换算也会发生改变 sp(scaled pixels, 比例像素):主要处理字体的大小,可以根据用户的字体大小首选项进行缩放。 in(英寸):标准长度单位,1 英寸=2.54 厘米。 mm(毫米):标准长度

汉堡怪兽 7963

Android 的屏幕适配

Android 的屏幕适配

QYgujingjing的专栏 3801

Android屏幕适配方案详解之今日头条方案和SmallestWidth

一、基础知识 px是真实像素单位,Pixel像素,不同手机的分辨率可能不同,比如一个100*100像素的控件在分辨率越来越高的手机上会在整体UI中看起来越来越小。 **dp **(dip)指的是设备独立像素,在不同分辨率和尺寸的手机上代表了不同的真实像素,比如在分辨率较低的手机中,可能1dp=1px,而在分辨率较高的手机中,可能1dp=2px,这样的话,一个100*100dp的控件,在不同的手机中就能表现出差不多的大小了。 dpi是像素密度,指的是在系统软件上指定的单位尺寸(英寸)的像素数量,它往往是写在系

尘埃zza的博客 1799

【Android】之屏幕适配

Android 系统能发展到今天,离不开其开源性,但是随着越来越多的设备接入 Android 系统,并对 Android 系统进行各种各样的定制,导致长期以来出现了各种碎片化严重的问题。例如,Android 屏幕尺寸多种多样,如 5 寸、5.9 寸、6 寸、6.1 寸 等等,当然,屏幕分辨率也是多种多样,这很容易导致同一元素在不同手机上显示的效果不同的问题,因此,Android 应用开发中的屏幕适配工作也越来越重要。本篇文章就介绍一下 Android 中屏幕适配相关的知识。

yang553566463的博客 7137

告别乱码!手把手教你用docx4j实现Word转PDF(附完整中文字体配置)

本文详细介绍了如何使用纯Java库docx4j实现Word到PDF的精准转换,并重点解决了中文乱码这一核心痛点。文章提供了从环境搭建、核心代码实现到中文字体配置的完整教程,特别针对Linux服务器部署场景,给出了详细的字体安装与映射方案,确保跨平台转换的稳定性和准确性。

nokia的博客 1153

Overleaf-Latex-Elsevier-图、表、参考文献标题及引用、伪代码写法(绝对详细直观且易懂)

overleaf爱思唯尔模板踩过的一些坑以及解决办法

2403_87584552的博客 5851

Android 今日头条屏幕适配详细使用攻略

今日头条屏幕适配的核心代码为基础进行了扩展封装,产生了《AndroidAutoSize》这个能快速接入使用的屏幕适配方案,这个屏幕适配方案是我遇到的截止2020.9.15为止最强大、简单有效的屏幕适配方案。...

luo_boke的博客 2万+

PX4代码解析(1)

前言 做pixhawk飞控有一段时间了,但在学习过程中遇到许多困难,目前网上找不到比较完整的PX4学习笔记,我打算结合自己理解,写写自己对PX4源码的理解,不一定对,只是希望与各位大佬交流交流,同时梳理一下无人机知识。 目前打算分享以下几个内容:代码架构;通信协议;姿态解算算法,控制算法。先这样,后面想到再加。本章先来聊聊px4代码结构 一、代码整体结构 既然要聊px4代码结构,那就先把px4代码结构图放出来,因为px4源码仍然在不断更新迭代,因此老版本与新版本目录结构可能有些不同,我的代码解析参考版本为V

qq_36903625的博客 1万+

Android 屏幕适配:最全面的解决方案

前言 Android的屏幕适配一直以来都在折磨着我们Android开发者,本文将结合: Google的官方权威适配文档 郭霖: Android官方提供的支持不同屏幕大小的全部方法 Stormzhang:Android 屏幕适配 鸿洋:Android 屏幕适配方案 凯子: Android屏幕适配全攻略(最权威的官方适配指导) 自身的思考&实践 给你带来一种全新、全面而逻辑清晰的An

贵公子丶笔记 7386

从防御者视角复盘:用WinArpAttacker和Wireshark在Windows上模拟并检测ARP欺骗攻击

本文详细解析了Windows平台下的ARP欺骗攻击与防御策略,通过WinArpAttacker和Wireshark工具模拟攻击并检测异常流量。文章涵盖实验环境搭建、攻击原理深度解析、流量特征分析及企业级防御方案,帮助安全运维人员全面掌握ARP攻击检测与防护技术。

weixin_30918633的博客 121

3GPP协议解读_NTN系列(一)_38.811_非地面网络(NTN)的背景、应用场景和信道建模

非地面网络覆盖广,对物理攻击和自然灾害有一定的抵抗性。本文根据3GPP协议对NTN网络的背景、应用场景和信道模型进行了整理。

JCMLSY的博客 4929

一种极低成本的Android屏幕适配方式(今日头条的技术分享)

原文链接:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA 在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高。虽然Android官方提供了dp单位来适配,但其在各种奇怪分辨率下表现却不尽如人意,因此下面探索一种简单且低侵入的适配方式。 传统dp适配方式的...

qq944639839的博客 292

Visual Studio 2022调试Godot 4 C#项目全攻略:从环境配置到断点调试

本文详细介绍了如何配置Visual Studio 2022以高效调试Godot 4 C#项目。从环境搭建、外部编辑器设置到两种核心调试模式(附加到进程与启动配置)的实战指南,帮助开发者构建无缝的工业级工作流,解决编码乱码、断点失效等常见问题,大幅提升开发与问题排查效率。

bush的博客 391

Android屏幕适配相关文章

一种极低成本的Android屏幕适配方式 1、Android 屏幕适配从未如斯简单(8月10日最终更新版) 亲测有用,可以再平板和手机上实现完美适配!! 2、骚年你的屏幕适配方式该升级了!-今日头条适配方案 3、看完不会Android屏幕适配我跪搓板 ...

songzi1228的博客 195

ContextCapture导入点云进行重建

ContextCapture导入点云进行重建

天桥飞熊的博客 1万+

基于粒子群优化的PID控制在药液流量控制系统中的应用

本文提出了一种基于粒子群优化(PSO)的PID控制算法,用于药液流量控制系统。系统采用C37控制器和Codesys 2.3编程环境实现,通过传感器实时监测流量、压力和车速,并控制水泵占空比和电动球阀开度来精确调节药液流量。硬件配置包括FT-2000流量传感器、PT-3000压力传感器和MV-500电动球阀等。控制算法将PSO与PID结合,使用ITAE指标优化PID参数,在Codesys中实现了包含PSO优化循环、PID控制等功能的程序模块。该系统通过分层控制策略和智能优化算法,提高了药液流量控制的精度和响应

AI的内部世界的博客 250

Android 屏幕适配方案

Android 目前稳定高效的UI适配方案 https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650826034&idx=1&sn=5e86768d7abc1850b057941cdd003927&chksm=80b7b1acb7c038ba8912b9a09f7e0d41eef13ec0cea19462...

尹东生的博文(Indson) 265

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

记录两种的Android屏幕适配方案

1.一种极低成本的Android屏幕适配方式   出自今日头条技术团队   https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA   下面是对今日头条适配方案的封装,不想看了,记录下来,有空看看       Android 屏幕适配从未如斯简单(8月10日最终更新版)       https://juejin.im/post/5b6250be...

梦想家Eva的专栏 349

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

一种极低成本的Android屏幕适配方式

转载:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高。虽然Android官方提供了dp单位来适配,但其在各种奇怪分辨率下表现却不尽如人意,因此下面探索一种简单且低侵入的适配方式。传统dp适配方式的缺点androi...

tx16bing的专栏 245

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

一种非常简单的Android屏幕适配方案

转载请作明出处: 前言 不知道大家有没有看过前一段时间今日头条技术团队发表的一篇关于Android屏幕适配的文章:一种极低成本的Android屏幕适配方式。没有看过的朋友可以先看看了解一下再回来,可以更好的理解。我是无意中点开的这篇文章,但是看过之后眼前一亮——-Android屏幕适配要是真的这么简单,那些辛辛苦苦没日没夜做适配的前辈们是不是死得太惨了。。。。。。。 测试与思考 不得不说今...

一种简单粗暴的Android屏幕适配方案 8699

安卓屏幕适配方案(根据今日头条方案,升级版)

屏幕适配方案有很多,比如原生的dp,鸿洋大神的AutoLayout,宽高限定符,今天我用缺点比较小的今日头条方案 头条适配方案的文章链接:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA 使用效果 测试后可以适配我身边的所有机型(其他的应该是都可以) 设置Activity后Activity可以适配 设置Activity后Activ...

lt的博客 4837

今日头条屏幕适配终极解决方案,很实用

热文导读|点击标题阅读互联网寒冬下,程序员如何突围提升自己?腾讯新开源一吊炸天神器—零反射全动态Android插件框架正式开源Flutter:究竟是大势所趋还是昙花...

Java和Android架构 7753

Android屏幕适配方案(出自今日头条)

最近两个月,今日头条公众号里推出的一款轻量级屏幕适配方案火了一把,身边好多小伙伴都不停的转发分享!今天终于有时间来给大家分析一下今日头条提出的适配方案了!各位系好安全带,要开车了!!! 前言 其实今日头条提出的方案,很早之前就有人提出过[check],但是一直不是传播的很好!直到最近,今日头条正式提出此方案,才使它被快速传播,这里不得不感叹品牌效应的威力! 原理 本方案的原...

李益 6186

今日头条Android适配方案,android 今日头条的屏幕适配理解

前一段时间无意中看到今日头条的适配方案,使用到项目中,感觉真的是无比丝滑。所以特意写一篇文章分享给小伙伴们!本文知识点:为什么要做屏幕适配今日头条的适配方案(划重点)今日头条的适配方案的一些问题1. 为什么要做屏幕适配做Android开发的都了解,由于Android屏幕碎片化严重,虽然Android官方提供了dp为单位的适配方案,但是由于各种千奇百怪的机型,所以变现往往不尽如人意。所以需要进行屏...

weixin_29813667的博客 2575

学习一种极低成本的Android屏幕适配方式

学习一种极低成本的Android屏幕适配方式 学习今日头条技术团队–>一种极低成本的Android屏幕适配方式 文章中刚开的的计算供着几个参数就没弄懂,搜了2遍不错的文章 两分钟理解Android中PX、DP、SP的区别 Android 中 px、dp、dip、sp详解 再回来看计算公式: px = density * dp; density = dpi / 160; ...

wdd1324的博客 1015

Android-屏幕适配(smallestWidth适配/今日头条屏幕适配方案终极版)

什么是 smallestWidth smallestWidth 翻译为中文的意思就是 最小宽度,那这个 最小宽度 是什么意思呢? 系统会根据当前设备屏幕的 最小宽度 来匹配 values-swdp,为什么不是根据 宽度 来匹配,而要加上 最小 这两个字呢? 这就要说到,移动设备都是允许屏幕可以旋转的,当屏幕旋转时,屏幕的高宽就会互换,加上 最小 这两个字,是因为这个方案是不区分屏幕方向的,它只会把...

wa172126691的博客 6102
上一篇: input checkbox 获取选中值和设置选中状态
下一篇: JS 中判断空值 undefined 和 null
圣剑Jay
博客等级 码龄15年 45粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值