这些读书笔记是根据《Android开发艺术探索》和《Android群英传》这两本书,然后将书上的一些知识点做一下记录。方便学习和理解,如果有存在侵犯版权的地方,还麻烦告知。个人强烈建议购买这两本书。真心不错。
本节是和《Android开发艺术探索》中的第6章 “Android的Drawable” 有关系,建议先买书查看这一章。
[]Drawable简介
Drawable的种类有很多,最常见的颜色和图片都可以是一个Drawable,Drawable可以做一些特殊的UI效果,Drawable比自定义View的成本要低,其次,非图片类型的Drawable占用空间较少,这对减少apk的大小也很有帮助。
Drawable一般通过XML来定义,也可以通过代码来创建具体的Drawable对象,建议采用XML来定义。Drawable的xml文件存放到res/drawable。
可以将Drawable设置为View的背景(设置android:background属性),也可以设置为ImageView的资源(设置android:src属性)。
Drawable的内部宽/高可以通过Drawable对象的getIntrinsicWidth()和getIntrinsicHeight()获取。但是并不是全部的Drawable都有内部宽/高,比如图片所形成的Drawable,它的内部宽/高就是图片的宽/高。颜色所形成的Drawable,它就没有内部宽/高的概念。Drawable的内部宽/高不等同于它的大小。一般来说Drawable是没有大小这个概念。当Drawable作为View的背景时,Drawable会被拉伸至View的同等大小。
[]BitmapDrawable
BitmapDrawable表示一张图片。
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:antialias="" 是否开启图片抗锯齿
android:dither="" 是否开启抖动效果
android:filter="" 是否开启过滤效果
android:gravity="" 图片与View的相对位置
android:src="" 图片资源id
android:tileMode="" 平铺模式
>
</bitmap>
开启图片抗锯齿后会让图片变得平滑。同时会在一定程度上降低图片的清晰度,但是这个降低的幅度较低以至于可以忽略。因此抗锯齿应该开启。
当图片的像素配置和手机屏幕的像素配置不一致时,开启抖动效果可以让高质量的图片在低质量的屏幕上还能保持较好的显示效果。因此抖动效果应该开启。
当图片尺寸被拉伸或者压缩时,开启过滤效果可以保持较好的显示效果,因此过滤效果应该开启。
平铺模式有四个值。分别是disabled(默认值),repeat,mirror,clamp。其中disabled表示关闭平铺模式,当平铺模式开启时,gravity属性会被忽略。repeat表示简单的水平和竖直方向的平铺效果。mirror表示一种在水平和竖直方向的镜面投影效果。clamp表示复制图片边缘的颜色来填充View剩下的空白部分,比如View的图片是白色的边缘,那么图片所在的View里除了图片,剩下的空间都会被填充成白色。
[]ShapeDrawable
参考
Android ShapeDrawable:http://blog.csdn.net/u011975949/article/details/50411018
[]LayerDrawable
LayerDrawable对应的xml标签是< layer-list >,它表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="" Drawable相对于View的底部的偏移量
android:drawable="" 指定Drawable,可以自定义Drawable
android:left="" Drawable相对于View的左边的偏移量
android:right="" Drawable相对于View的右边的偏移量
android:top="" Drawable相对于View的顶部的偏移量
/>
<item android:gravity="" Drawable缩放后相对于View的位置>
<bitmap android:src="" >
</item>
......
</layer-list>
默认情况< layer-list >中的所有Drawable都会被缩放至View的大小。
对于< bitmap >,需要使用 android:gravity 属性才能控制图片的显示效果。
< layer-list >中下面的item会覆盖上面的item。通过合理的分层可以实现一些特殊的叠加效果。
[]StateListDrawable
参考
Android selector标签: http://blog.csdn.net/u011975949/article/details/50411072
[]LevelListDrawable
LevelListDrawable对应的xml标签是< level-list >,它同样表示一个Drawable集合,集合中的每一个Drawable都有一个等级(level)。根据不同的等级,LevelListDrawable会切换为对应的Drawable。
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="" 指定Drawable,可以自定义Drawable
android:maxLevel="" 最大级别
android:minLevel="" 最小级别
>
</item>
</level-list>
在最大值和最小值之间的级别会对应此< item >中的Drawable。级别的范围是0——10000,View默认级别是0。
LevelListDrawable作为View的背景时,可以通过Drawable对象的setLevel()设置不同的级别从而切换Drawable。
Drawable mDrawable = View对象.getBackground();
mDrawable.setLevel(260);
如果LevelListDrawable作为ImageView的资源时(设置android:src属性),还可以通过ImageView对象的setImageLevel()来切换Drawable。
ImageView对象.setImageLevel(260);
[]TransitionDrawable
TransitionDrawable对应的xml标签是< transition>,它用于实现两个Drawable之间的淡入淡出效果。
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="" 指定Drawable,可以自定义Drawable
......
>
</item>
......
</transition>
TransitionDrawable mDrawable = (TransitionDrawable) View对象.getBackground();
//正向切换,即从第一个drawable切换到第二个
mDrawable .startTransition(1000);
//逆向切换,即从第二个drawable切换回第一个
mDrawable.reverseTransition(1000);
TransitionDrawable继承LayerDrawable,也会有叠加的效果。但是只限于二个item,淡入淡出效果其实就是修改第二个item的透明度(Alpha)来实现的。
[]InsetDrawable
InsetDrawable对应的xml标签是< inset >,它可以将其他Drawable内嵌到自己当中,并可以在四周留出一定的间距,当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现,当然这种效果也可以通过LayerDrawable来实现。和LayerDrawable相比,它设置的偏移量会影响控件的内容偏移量,但是LayerDrawable不会。
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="" 指定Drawable,可以自定义Drawable
android:insetBottom="" Drawable相对于View的底部的偏移量
android:insetLeft="" Drawable相对于View的左边的偏移量
android:insetRight="" Drawable相对于View的右边的偏移量
android:insetTop="" Drawable相对于View的顶部的偏移量
>
</inset>
[]ScaleDrawable
ScaleDrawable对应的xml标签是< scale >,它可以根据自己的级别将指定的Drawable缩放到一定的比例。
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="" 指定Drawable,可以自定义Drawable
android:scaleGravity="" 图片与View的相对位置
android:scaleHeight="" Drawable高的缩放比例,百分比表示
android:scaleWidth="" Drawable宽的缩放比例,百分比表示
android:level="" 设置级别
>
</scale>
级别的范围是0——10000,默认级别是0。级别为0表示ScaleDrawable不可见。所以必须设置ScaleDrawable的级别大于0且小于等于10000。
ScaleDrawable scaleDrawable= (ScaleDrawable) View控件.getBackground();
scaleDrawable.setLevel(8000);
[]ClipDrawable
ClipDrawable对应的xml标签是< clip >,它可以根据自己当前的级别来裁剪Drawable。
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="" 裁剪的方向
android:drawable="" 指定Drawable,可以自定义Drawable
android:gravity=""
>
</clip>
ClipDrawable裁剪的方向是通过clipOrientation和gravity这两个属性共同决定的,其中clipOrientation属性有竖直(vertical)和水平(horizontal),gravity属性比较复杂,需要和clipOrientation配合使用才生效。
Drawable的级别是在0——10000,级别为0时表示完全裁剪,即整个Drawable都不见。级别为10000表示不裁剪。下面设置级别为8000,表示裁剪2000。
ClipDrawable clipDrawable = (ClipDrawable) View控件.getBackground();
clipDrawable.setLevel(8000);