B:支持不同分辨率的设备
这一课告诉大家怎样通过提供不同的资源以及使用与分辨率无关的测量单位来支持不同分辨率的设备。
B.a 使用与密度无关像素
在你设计你的布局时,最常遇到的一个必须避免的陷阱就是只是绝对像素来定义大小和距离,使用像素定义布局的大小是一个难题,因为不同的屏幕拥有不同的像素密度,所以相同的像素点可能相当于不同的物理大小在不同的设备上面。所以,在指定大小的时候,经常使用dp或者sp作为单位,1dp就是1与分辨率无关像素相当于在分辨率为160的设备上的一个像素点大小。sp同样是基础单位,但是是按用户的首选字体大小缩放(是一个比例无关像素),所以在定义字体大小时可以使用这个单位(不要用到定义布局的大小上面去)。
例如,当你指定两个views间的空间时,使用dp而不是px:
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clickme"
android:layout_marginTop="20dp" />
当指定字体大小时,使用sp:
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp" />
B.b
提供可选择的位图
因为Android运行在各种各样屏幕分辨率的设备上,你应该提供你的位图资源来适应每种广义上的分辨率标准:低、中、高以及超高分辨率。这将会帮助你完成好的绘图质量以及表现在所有分辨率的设备上。
为了生成这些图片,你需要一张你未加工过的图片,然后使用下面的缩放比例来生成支持不同分辨率的图片:
xhdpi
: 2.0
hdpi
: 1.5
mdpi
: 1.0 (baseline)
ldpi
: 0.75
意思就是你如果为超大分辨率提供一张200*200的图片,
你就应该为高分辨率提供150*150大小的相同资源,100*100大小的相同资源给中分辨率,以及75*75大小的相同资源给小分辨率设备。
然后,将生成的图像放在res/文件夹下适当的子目录里,然后系统将自动根据现在设备的屏幕分辨率选择正确的一个文件夹下的资源:
MyProject/ res/ drawable-xhdpi/ awesomeimage.png drawable-hdpi/ awesomeimage.png drawable-mdpi/ awesomeimage.png drawable-ldpi/ awesomeimage.png之后,任何时候你引用
@drawable/awesomeimage
,系统都会根据你的屏幕分辨率来选择合适的位图了。