# 屏幕适配

# 预备知识

# dpi是什么

dpi是像素密度, 通过 像素/尺寸 得出。 也就是一英寸上有多少个像素。 在安卓中的dpi是以对角线的dpi为准。所以会出现宽高比例不同当dpi一致的情况。

# dp是什么

Android是安卓中的一个虚拟单位。 这个单位可以根据dpi换算成像素。在dpi160的设备上1dp=1px。

# 为什么以160dpi为基准

谷歌官方文档中对此说明:因为第一款Android设备(HTC的T-Mobile G1)dpi是160。

# dp解决了什么问题

dp适配了在不同密度的设备上, 显示的物理尺寸一致。 比如设置160dp,在任何设备上都是一英寸。 因为dp根据像素密度来换成成对应设备的像素。 在一英寸有160像素点的设备上,1dp就换成成1个像素, 320密度上,1dp就换算成2个像素。

# dp没解决什么问题

既然dp在任何设备上1英寸就是1英寸, 那一个4英寸宽的按钮,就可能在5英寸宽的设备上显示有空余空间, 而在3英寸宽的设备显示不下。

# 屏幕适配原理

要让上面4英寸宽的按钮在3英寸和5英寸宽的设备上的显示效果和在4英寸宽的设备上的显示效果一样, 就要根据目标设备,去等比缩放。 比如在4英寸宽的设备图上的一个3英寸的按钮, 在8英寸宽的设备上, 就应该放大两倍变成6英寸去显示。这样根据目标设备去缩放,才能做到在任何设备上的显示效果都和设计图一致。

# 屏幕适配具体实现方案

实现有2种方式

  • 适配dp单位

  • 适配pt单位

不管是适配dp单位, 还是适配pt单位, 原理都是等比缩放(目标设备的宽/设计设备的宽)倍。 dp是根据DisplayMetrics类中density来缩放的, 所以更改这个值就行。 pt是DisplayMetrics类中xdpi。

# dp方案的不足

dp方式更改density后, 有可能会被其他地方更改导致被还原,比如打开webview的时候。 并且所有的使用dp的地方都会被修改大小。 不能做到单独适配。

# dp方案的改进

通过使用pt方式来适配, 更改xdpi的值之后不会被还原,因为view每次的在使用尺寸的时候都会调用getresource这个方法去获取这个值。 并且可以在想要适配的地方再使用这个单位适配, 其他要保留原来的dp方式的地方还用dp。

# pt方案的不足

只能适配宽高一个维度的不足 因为在布局中,宽高使用了同样的单位, 所以缩放是等比缩放。 等比缩放意味着只能适配一个维度。 以宽为标准适配的话,高就要自适应。 以高为标准的话, 宽就要自适应。

# pt方案的改进

  1. 以宽为适配标准, 高度自适应加滚动条。
  2. 通过两种单位, 来对宽高进行不同比例的适配。
Last Updated: 1/9/2024, 11:22:13 AM