这节课程向你展示如何通过提供不同的资源和使用与分辨率无关的测量单位,支持不同屏幕密度。
使用密度无关的像素
——————————————————————————————————————————————————————————————
当设计你的布局的时候,你必须避免的一个常见的缺陷是使用绝对像素来定义距离和尺寸。用像素定义你的布局的尺寸是一个问题,因为不同的屏幕有不同的像素密度,所以同样的像素可能在不同的设备上,对应不同的物理尺寸。因此,当指定尺寸的时候,总是使用dp或者sp单位。1dp是一个密度独立的像素,它对应的物理大小是在160dpi中的1像素。1sp是相同的基本单位,但是它以用户首选的文本大小缩放(它是比例独立的像素),所以你在定义文本大小的时候使用这个测量单位(但是不用于布局大小)。
例如,当你指定两个视图之前的空间的时候,使用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" />
提供可选的位图
——————————————————————————————————————————————————————————————
由于Android运行在具有广泛屏幕密度的设备上,你应该总是根据每个广义的密度度量定制你的位图资源:low,medium,high和extra-high密度。
为了产生这些图像,你应该从你矢量格式的原始资源开始,然后使用下面的大小缩放产生每个密度的图片:
xhdpi:2.0
hdpi:1.5
mdpi:1(基准)
ldpi:0.75
这意味着如果你为xhdpi设备生成一个200*200的图片。你应该为hdpi生成150*150同样的资源,为mdpi 100*100和最后为ldpi设备75*75的图片。
然后,将这些生成的图片放置的res/目录下对应的子目录中。你的应用程序在运行的时候,系统会基于设备屏幕的密度,自动选择正确的图片:
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
然后,你在任何使用引用@drawable/awesomeimage,系统基于屏幕的dpi选择合适的位图。
更多关于为你的应用创建图标资源的提示和指导,查看Icon Design Guidelines。