一、dp 和 sp 的区别
由于手机屏幕分辨率各有不同,而且无法调整当前手机的分辨率,因此,Android SDK提供了dp 和 sp 两个尺寸单位来根据分辨率调整组件和字体的大小。dp 和 sp 都是相对于160 dpi 的尺寸单位的。160 dpi 相当于每英寸屏幕上有160个物理像素点,一般320*480 或里诶死大小的分辨率的屏幕都是160 dpi 。因此,如果程序运行在带160 dpi 屏幕的手机上,dp、sp 和px的效果是一样的。但如果是更高分辨率的屏幕,如240 dpi (一般是480 * 800 分辨率的屏幕),px仍然会根据实际物理像素处理,而dp 和 sp 会用当前值乘以一个系数(240 / 160 =1.5)。例如,如果两个按钮的 android:layout_width 属性值分辨设为160 px 和 160 dp,在
320 * 480 分辨率的屏幕上,按钮的宽度是完全相同的,但在480 * 800 分辨率的屏幕上宽度为160dp 的按钮的实机宽度就变为 240 px(240个像素点),会比宽度160 px的按钮宽50% 。在不同分辨率屏幕上显示的效果如下图所示
sp 不仅可以按屏幕密度对尺寸进行调整,还可以按着用户设置的不同字体调整文字的尺寸,使文字以最好的效果显示。因此建议设置文字大小时使用sp,设置其他尺寸是使用dp。
二、drawable资源问题
drawable 目录不仅可以存储普通的图像资源,还可以存储xml图像资源。图像状态资源就是其中之一。与图像状态资源类似的还有淡入淡出资源和图像级别资源。其中淡入淡出资源只允许在两个图像之间进行切换,只是在两个图像之间采用了淡入淡出效果进行切换。图像级别资源可以为更多的图像定义级别,但需要使用代码进行控制。在drawable目录中的各种资源都可以使用类似android:src、android:background 这样的属性指定。
淡入淡出资源文件的例子代码如下;
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/lamp_on"></item>
<item android:drawable="@drawable/lamp_off"></item>
</transition>
图像级别资源代码如下:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/lamp_on" android:minLevel="10" android:maxLevel="6" ></item>
<item android:drawable="@drawable/lamp_off" android:minLevel="12" android:maxLevel="20"></item>
</level-list>
其中图像级别资源中的每一个<item> 标签标示一个级别区间。级别区间用android:minLevel 和android:maxLevel属性设置。setImageLevel 或setLevel 方法设置的几倍在某个区间内(android:minLevel<= level<=android:maxLevel),系统就会先用按个区间对应的图像(用android:drawable属性设置)。可以使用如下代码设置组件的图像级别。
ImageView ivLamp = findViewById(R.id.iv0001);
//设置level 为8,显示lamp_off.png
ivLamp.setImageLevel(8);
注:如上内容摘取自《Anroid 高薪程序员面试宝典一书》