欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android屏幕适配的理解

程序员文章站 2022-04-14 11:28:07
android屏幕适配的理解经常在开发中被dp、px搞的很头大,就理了下android适配。首先要理解android屏幕适配在做什么,就是在不同的手机上看到的ui效果是一致的。我觉的,不管是什么适配方案,最终都要归结于px,为什么,因为屏幕就认识px啊,他不认dp,对于屏幕而言,你的程序只要告诉我你要渲染的内容宽是多少像素、高是多少像素。但是,如何用一套代码在不同分辨率的手机上显示相同效果呢?要达到这个目的,就需要在代码中告诉手机在不同的分辨率手机上应该渲染几个像素。方案一:于是,最直接的方案就...

android屏幕适配的理解
经常在开发中被dp、px搞的很头大,就理了下android适配。

首先要理解android屏幕适配在做什么,就是在不同的手机上看到的ui效果是一致的。

我觉的,不管是什么适配方案,最终都要归结于px,为什么,因为屏幕就认识px啊,他不认dp,对于屏幕而言,你的程序只要告诉我你要渲染的内容宽是多少像素、高是多少像素。
但是,如何用一套代码在不同分辨率的手机上显示相同效果呢?要达到这个目的,就需要在代码中告诉手机在不同的分辨率手机上应该渲染几个像素。

方案一:
于是,最直接的方案就是

├── src/main
│   ├── res
│   ├── ├──values
│   ├── ├──values-800x480
│   ├── ├──values-860x540
│   ├── ├──values-1024x600
│   ├── ├──values-1024x768
│   ├── ├──...
│   ├── ├──values-2560x1440

让系统选择对应分辨率的dimens.xml 。其本质是按比例在不同分辨率设备上设置需要渲染像素的大小。既然是按比例,就需要有个基准,其他分辨率都按照这个基准进行缩放。
但是这个方案有个缺陷,就是系统如果找不到对应的分辨率就会直接匹配默认的dimens.xml,这样的后果就是部分匹配不到的设备ui差别太大。

怎么解决这个问题呢?于是有人提出了方案二:
虽然系统不能就近匹配分辨率,但是可以就近匹配dp啊,于是方案二是这样:

├── src/main
│   ├── res
│   ├── ├──values
│   ├── ├──values-sw320dp
│   ├── ├──values-sw360dp
│   ├── ├──values-sw400dp
│   ├── ├──values-sw411dp
│   ├── ├──values-sw480dp
│   ├── ├──...
│   ├── ├──values-sw600dp
│   ├── ├──values-sw640dp

这俩个方案的本质是一样的,为什么呢?
首先看下这个values-sw360dp是怎么算出来的,假设设备的像素是1920*1080,dpi = 480,那么计算values = 1080/(480/160),由于最终的像素值还是要用dp * (dpi/160),因此,这种方式本质还是像素的缩放,只是系统会做就近匹配。

我一直有个疑问,使用dp会不会有风险啊,因为获取到的dpi是可以厂商直接写进去的,例如这样:
ro.sf.lcd_density=320
如果设置的不准,跟实际物理dpi(像素值/尺寸)相差很远,会不会有问题。
还是以像素1920*1080,dpi = 480为例,values-sw360dp如下:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <dimen name="dp_1">1dp</dimen>
    <dimen name="dp_2">2dp</dimen>
    <dimen name="dp_3">3dp</dimen>
    <dimen name="dp_4">4dp</dimen>
    <dimen name="dp_5">5dp</dimen>
    <dimen name="dp_6">6dp</dimen>
    <dimen name="dp_7">7dp</dimen>
    <dimen name="dp_8">8dp</dimen>
    <dimen name="dp_9">9dp</dimen>
    <dimen name="dp_10">10dp</dimen>
    ...
    <dimen name="dp_356">356dp</dimen>
    <dimen name="dp_357">357dp</dimen>
    <dimen name="dp_358">358dp</dimen>
    <dimen name="dp_359">359dp</dimen>
    <dimen name="dp_360">360dp</dimen>
</resources>

如果系统设置dpi = 320,那按照方案二获取到的应该是values-sw540dp,如下:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <dimen name="dp_1">1.5dp</dimen>
    <dimen name="dp_2">3dp</dimen>
  
    ...
    <dimen name="dp_360">540dp</dimen>
</resources>

由于最终都要转化成像素,1dp在dpi = 480标注的系统里获取到的像素是1dp * (480/160) = 3px,在dpi = 320标注的系统里获取到的是1.5dp * (320/160) =3px,可见,效果是一致的。因此,方案二容错率更高一些。
参考地址:https://zhuanlan.zhihu.com/p/144487134

本文地址:https://blog.csdn.net/chao18867105705/article/details/108981301

相关标签: android