Android入门——Drawable与对应的资源xml的应用
引言
Android 中的Drawable是一个抽象的概念,换言之所有能被画出来的都可以定义成Drawable(A Drawable is a general abstraction for “something that can be drawn.” )。所以Android应用中使用最为广泛和最灵活的资源,不仅仅可以直接使用.png、.9.png、.gif、.jpg等图片作为资源,还可以使用多种XML文件。
一、Drawable概述
Drawable同时也是一个抽象类,我们在Android开发中不直接使用,往往都是使用它的派生类,常见的派生类有:BitmapDrawable, ClipDrawable, ColorDrawable, DrawableContainer, GradientDrawable, InsetDrawable, LayerDrawable, NinePatchDrawable, PictureDrawable, RotateDrawable, ScaleDrawable, ShapeDrawable,AnimationDrawable, LevelListDrawable, PaintDrawable, StateListDrawable, TransitionDrawable。在程序中我们可以通过Resource类的getDrawable(int id,int theme)获取对应的Drawable对象。
二、Drawable系的应用
1、StateListDrawable(selector xml文件)
说起selector xml文件大家都知道,但是StateListDrawable我相信有相当数量的人员不一定了解。StateListDrawable可以用于组织多个Drawable对象,常被用于view的背景、前景,当view的状态改变的时候而自动切换。
1.1、StateListDrawable对象的xml文件结构
对应的根元素为selector,可以包含多个item元素
android:color或者android:drawable:可设置指定颜色或Drawable对象 adnroid:state_xxx:一个特定的状态状态属性值 | 含义 |
---|---|
android:state_active | 是否处于激活状态 |
android:state_checkable | 是否可勾选 |
android:state_checked | 是否已勾选 |
android:state_enabled | 是否可用 |
android:state_first | 是否开始状态 |
android:state_focused | 是否已得到焦点 |
android:state_last | 是否处于结束 |
android:state_middle | 是否处于中间 |
android:state_pressed | 是否处于按下状态 . |
android:state_selected | 是否处于选中状态 |
android:state_window_focused | 是否窗口已获得焦点 |
例:selector_mybutton.xml
<code class=" hljs xml"><!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%20%3F%2D%2D%3E--> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!--{cke_protected}{C}%3C!%2D%2D%20%E9%BB%98%E8%AE%A4%E6%97%B6%E7%9A%84%E8%83%8C%E6%99%AF%E5%9B%BE%E7%89%87%2D%2D%3E--> <item android:drawable="@drawable/pic1"> <!--{cke_protected}{C}%3C!%2D%2D%20%E6%B2%A1%E6%9C%89%E7%84%A6%E7%82%B9%E6%97%B6%E7%9A%84%E8%83%8C%E6%99%AF%E5%9B%BE%E7%89%87%20%2D%2D%3E--> <item android:state_window_focused="false" android:drawable="@drawable/pic_nofocus"> <!--{cke_protected}{C}%3C!%2D%2D%20%E9%9D%9E%E8%A7%A6%E6%91%B8%E6%A8%A1%E5%BC%8F%E4%B8%8B%E8%8E%B7%E5%BE%97%E7%84%A6%E7%82%B9%E5%B9%B6%E5%8D%95%E5%87%BB%E6%97%B6%E7%9A%84%E8%83%8C%E6%99%AF%E5%9B%BE%E7%89%87%20%2D%2D%3E--> <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/pic_click"> <!--{cke_protected}{C}%3C!%2D%2D%20%E8%A7%A6%E6%91%B8%E6%A8%A1%E5%BC%8F%E4%B8%8B%E5%8D%95%E5%87%BB%E6%97%B6%E7%9A%84%E8%83%8C%E6%99%AF%E5%9B%BE%E7%89%87%2D%2D%3E--> <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/pic_touch"> <!--{cke_protected}{C}%3C!%2D%2D%E9%80%89%E4%B8%AD%E6%97%B6%E7%9A%84%E5%9B%BE%E7%89%87%E8%83%8C%E6%99%AF%2D%2D%3E--> <item android:state_selected="true" android:drawable="@drawable/pic_select"> <!--{cke_protected}{C}%3C!%2D%2D%E8%8E%B7%E5%BE%97%E7%84%A6%E7%82%B9%E6%97%B6%E7%9A%84%E5%9B%BE%E7%89%87%E8%83%8C%E6%99%AF%2D%2D%3E--> <item android:state_focused="true" android:drawable="@drawable/pic_getfocus"> </item></item></item></item></item></item></selector></code>
2、LayerDrawable(layer-list xml文件)
LayerDrawable与StateListDrawable类似,也可以包含一个Drawable数组,系统将会按这些Drawable对象的数组顺序来绘制,索引最大的Drawable将会被绘制在最上面。
2.1、LayerDrawable对象的xml文件结构
其根节点是layer-list,也可以包含多个item元素:
android:drawable:指定要包含的Drawable对象 android:id:Drawable的Id adnroid:buttom | top | left | button:用于指定一个长度值,指定该Drawable对象绘制到目标组件的指定位置。2.2、在xml中实现LayerDrawable
<code class=" hljs xml"><!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%2D%2D%3E--> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!--{cke_protected}{C}%3C!%2D%2D%E6%9C%80%E5%BA%95%E5%B1%82%2D%2D%3E--> <item> <bitmap android:src="@mipmap/ic_blue_launcher" android:gravity="center"> </bitmap></item> <!--{cke_protected}{C}%3C!%2D%2D%E6%AC%A1%E4%B8%8A%E5%B1%82%2D%2D%3E--> <item android:top="10dp" android:left="10dp"> <bitmap android:src="@mipmap/ic_red_launcher" android:gravity="center"> </bitmap></item> <!--{cke_protected}{C}%3C!%2D%2D%E6%98%BE%E7%A4%BA%E5%9C%A8%E6%9C%80%E4%B8%8A%E9%9D%A2%2D%2D%3E--> <item android:top="20dp" android:left="20dp"> <bitmap android:src="@mipmap/ic_green_launcher" android:gravity="center"> </bitmap></item> </layer-list></code>
2.3、在Java代码中动态生成并使用
Resources resources = getResources();
Drawable[] layers = new Drawable[3];
layers[0] = r.getDrawable(R.drawable.ic_blue_launcher);
layers[1] = r.getDrawable(R.drawable.ic_red_launcher);
layers[2] = r.getDrawable(R.drawable.ic_green_launcher);
LayerDrawable layerDrawable = new LayerDrawable(layers)
((ImageView) findViewById(R.id.imageview)).setImageDrawable(layerDrawable);
/*在java代码中引用: */
((ImageView) findViewById(R.id.imageview)).setImageDrawable(getResources().getDrawable(R.drawable.layer_bcg)
2.4、在xml中使用layer-list
2.5、利用LayerDrawable实现图片简单合成
在Android平台中Bitmap的叠加处理可以通过Canvas逐层绘画就可以了,而Drawable的叠加呢? 除了使用BitmapDrawable的getBitmap方法将Drawable转换为Bitmap外,还有另一个方案——LayerD