1. LCD的DPI计算
不同的LCD根据其分辨率计算其自身DPI 方式如下:
DPI=(x2 + y2)0.5/ L,其中x,y为LCD的宽高,L为其对角线长度,单位为inch
如7.84 英寸的iPadmini 屏的DPI为:DPI768x1024= (7682+ 10242)0.5/ 7.84 = 1280/7.84 = 163
4.3.2.Android标准案中的DPI选择
原则上Android的应用布局及UI 样式可以根据DPI 的设置达到各种不同的选择及缩放
效果,但由于Google Play 的过滤机制以及部分APP 的兼容性问题,在Android 方案实现上
最好能够从160、213、240、320 四种DPI中选择配置方案。
4.3.3.方案的DPI设置
不同的DPI设置会决定运行时APP 选择什么样的系统资源配置,在Android 代码资源
文件中,我们会发现存在大量的类如layout、layout-sw600dp、layout-sw720dp 以及value、
value-sw600dp和value-sw720dp 的文件夹,这些文件夹就存放了不同的dp 实现下所对应的
资源文件。方案实际DPI 的设置需要修改android/device/softwinner/fiber-xxx/fiber-xxx.mk 文
件,添加ro.sf.lcd_density属性,如下行:
PRODUCT_PROPERTY_OVERRIDES += \
ro.sf.lcd_density=213 \
qemu.hw.mainkeys=0 \
persist.sys.hdmistate=100 \
persist.sys.usb.config=mass_storage,adb\
方案的DP实现计算方法如下:
DP = shortsize x 160 / dpi,其中shortsize 为短边像素数,dpi 为方案设置的设置的dpi 值,即lcd_density
选择资源文件的依据为:
1:当DP<600,将选择普通的layout、value 中的资源文件,即480dp 资源,表现为
Phone UI 界面
2:当600 < DP < 720,将选择600dp 的资源文件,表现为大屏手机UI,即PhoneTablet
UI(Nexus7 UI)
3:当DP > 720,将选择720dp 的资源文件,表现为Tablet UI 界面
方案配置DPI 的原则有两个:
1. LCD 实际DPI 就近原则
2. 所需要选择的资源类型
如1024x600 的7 寸LCD 的实际DPI 计算出来为170,设置为160 时其DP 为600 x 160
/ 160 = 600,这样就可以在运行时选择使用600dp 的资源文件;
又如1280x800 的7 寸LCD 的实际DPI 计算出来为216,设置为213 时其DP 为800 x 160
/ 213 = 601,因此在运行时同样选择使用600dp 的资源文件;如果选择160,其DP 计算出
为800,那么将选择720dp 的资源文件从而转换为Table UI,其效果可自行修改查看。
4.3.4. Layout冲突问题
选择合适的DPI 可以在方案实现上呈现出较为理想的屏幕表现效果,但是有时候在个
体方案实现时想要使用特定的UI 布局,就可能产生layout 设置冲突问题,如在768x1024
的7.84 屏上实现PhoneTablet UI 样式。
通常情况下此屏选择设置lcd_density 为160 可以达到较为理想的显示效果,即采用
Tablet 布局资源,因为其DP = 768 x 160 / 160 = 768dp,应用运行时将会采用720dp 的资源
文件。
如果我们想要在产品上表现出600dp 的布局,那么我们有2 种方法可以采用,如下:
1. 设置DPI,使其DP 大于600 并小于720,此时DPI 选择范围为171 ~ 204;
2. 选择更大的标准DPI,如213,此时其DP 计算出为576,小于600dp;
那么在此LCD 上如果想要实现大屏手机UI 便产生了layout 冲突。
在这两种方法中,第一种方法因为其dpi 值不是从标准dpi 中选择而来,从而会造成很
多APP 的布局适配问题(因为部分APP 仅对标准的几种布局进行适配),或者引起兼容性
导致的Google Play 过滤问题;第二种方法因Android 本身缺乏576dp 的资源文件,那么在
方案实现的时候就需要将系统相关的600dp 的资源文件复制一份并修改其名称为576dp,在
213dpi 设置下强制使用600dp 一样的参数值会在应用布局上产生巨大的变化,这样就会涉及
到各个系统应用资源文件的layout 和value 的调整问题,方案实现难度较大。
在目前A31s 的SDK2.0 中的fiber-a31st 方案中即采用了第二种方法, 请参考
fiber-xxx/overlay、framework/base/core/res/res 及packages/apps/Launcher2/res/目录下的576dp
的相关资源。