Android把所有显示出来的图形都抽象为Drawable(该单词意思就是“可绘制的”),这里的图形不只是图片,还包括色块、画板、背景等等。android.graphics.drawable源码目录下的drawable有十几种,博主就不一一介绍了,只说说一些常见的用法,以及容易弄错的地方。
drawable文件放在res目录的各个drawable目录下,\res\drawable一般放的是描述性的xml文件,图片文件一般放在具体分辨率的drawable目录下。例如 drawable-ldpi里面主要放低分辨率的图片,如QVGA(240×320) drawable-mdpi里面主要放中等分辨率的图片,如HVGA(320×480) drawable-hdpi里面主要放高分辨率的图片,如WVGA(480×800),FWVGA(480×854) drawable-xhdpi里面主要放加高分辨率的图片,如Nexus(720×1280)以上分辨率 drawable-xxhdpi里面主要放超高分辨率的图片,如Nexus(1080×1920)以上分辨率
基本上分辨率每加大一级,宽度和高度就要加大二分之一像素。如果各目录存在同名图片,则Android会根据手机的分辨率来分别适配对应文件夹里的图片。所以在开发APP时,为了兼容不同的手机屏幕,根据需求在不同目录存放不同大小的图片,才能达到最合适的显示效果。
比如说,我在drawable-hdpi放了一张背景图片bg.png(分辨率480×800),其他目录就没放,使用分辨率480×800的手机查看该APP是没有问题的,但是现在有一台分辨率高的手机如720×1280,在这个高分辨率手机上查看APP,就会发现背景图片有点模糊,原因是Android为了bg.png适配屏幕,把bg.png拉伸到了720×1280,拉伸的后果便是图片糊掉了。
简单的drawable都是静态的图形,现在我们让它动一下,根据不同的触摸情况来变更图形,这时就要用到Drawable的一个子类StateListDrawable。StateListDrawable是在一个xml文件中定义不同状态下呈现的图像。 下面是一个例子btn_visit_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/common_jia_selected" />
<item android:drawable="@drawable/common_jia_normal" />
</selector>
该xml中关键点是state_pressed,该值为true表示按下时显示common_jia_selected图像,其余情况显示common_jia_normal图像。 常用的状态位有: state_pressed:为true时表示按下,一般用于按钮Button,图形设置于android:background state_checked:为true时表示勾选,一般用于单选框RadioButton、复选框CheckBox,图形设置于android:drawableLeft state_selected:为true时表示选中,一般用于单选框RadioButton、复选框CheckBox,图形设置于android:background state_focused:为true时表示获取焦点,一般用于文本框EditText,图形设置于android:background