http://blog.csdn.net/guolin_blog/article/details/44171115
http://hujiaweibujidao.github.io/blog/2015/11/30/Art-of-Android-Development-Reading-Notes-6/
http://blog.csdn.net/lmj623565791/article/details/45022631
Drawable简介
Drawable的内部宽/高这个参数比较重要,通过getIntrinsicWIdth
和getIntrinsicHeight
这两个方法可以获取到它们,而图片和颜色所形成的Drawable则不可以这样计算
Drawable的分类
- * BItmapDrawable和NinepatchDrawable*
<?xml version="1.0" encoding="utf-8"?>
<bitmap / nine-patch
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@[package:]drawable/drawable_resource"
android:antialias=["true" | "false"]
android:dither=["true" | "false"]
android:filter=["true" | "false"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
android:antialias
是否开启图片抗锯齿功能,开启后会让图片变得平滑,同时也会在一定程度上降低图片的清晰度,应该开启。
android:dither
是否开启抖动,当图片的像素配置和手机屏幕的像素配置不一致时,开启这个选项可以让高质量的图片在低质量的屏幕上还能保持较好的显示效果。建议开启
android:filter
是否开启过滤效果。当图片尺寸被拉伸或者压缩时,开启过滤效果可以保持较好的显示效果。建议开启。
android:tileMode
平铺模式。有如下几个值:["disabled"|"clamp"|"repeat"|"mirror"|]
,其中disable表好关闭平铺模式,这也是默认值。
- repeat表示简单的水平和竖直方向上的平铺模效果。
- mirror表示一种在水平和竖直方向上的镜面投影效果
- clamp表示图片第四周的效果会扩展到周围区域
NinePatchDrawable和BitmaoDrawable一样
2. ShapeDrawable
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle" | "oval" | "line" | "ring"] >
<corners //当shape为rectangle时使用
android:radius="integer" //半径值会被后面的单个半径属性覆盖,默认为1dp
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer" />
<gradient //渐变
android:angle="integer"
android:centerX="integer"
android:centerY="integer"
android:centerColor="integer"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type=["linear" | "radial" | "sweep"]
android:useLevel=["true" | "false"] />
<padding //内边距
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer" />
<size //指定大小,一般用在imageview配合scaleType属性使用
android:width="integer"
android:height="integer" />
<solid //填充颜色
android:color="color" />
<stroke //边框
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer" />
</shape>
其实体实际上是GradientDrawable
andorid:shape
表示图片的形状:有四个选项:rectangle(矩形)、oval(椭圆)、line(横线)、ring(圆环)
corners
表示shape的四个角的角度,只适用于矩形shape
<gradient>
表示渐变效果,其中渐变的角度默认为0
<solid>
表示纯色填充
<stoke>
表示描边,其中abdroud:dashWidth和android:dashGap有任何一个为0,那么虚线效果将不能生效。
3. LayerDrawable
<layer_list>
...
<item
andorid:drawable = "@[package:]drawable/drawable_resource"
ahdroid=...
...
>
</layer - list>
Layer-list有层次的概念,下面的item会覆盖上面的item.通过合理的分层,可以实现一些特殊的叠加效果。
4. StateListDrawable
StateListDrawable对应于<selecor>
标签,主要永固设置可单击的View的背景。一般来说默认的irem都应该放在selector的最后一条并且不附带任何状态。
5.* LevelListDrawable*
对应于<level-list>
标签,同样表示一个Drawable集合,集合中的每个Drawable都有一个等级(level)概念。(Drawable的等级是由范围的,即0~10000,最小的等级是0,这也是默认值,最大等级是10000
)
6. TransitionDrawable
TransitionDrawable对应于<transition>
标签,它用于实现两个Drawable之间的淡入淡出效果。
7. InsetDrawable
对应于<inset>
标签,它可以将其他Drawable内嵌到自己当中,并可以给四周留出一定的间距。
8. ScaleDrawable
对应于<scale>
标签,它可以根据自己的等级将指定的Drawable缩放到一定的比例。默认情况下:等级对于ScaleDrawable的影响,等级为0表示ScaleDrawable不可见,这是默认值。
要让它使用等级不能等于0.等级越高,缩放比例越大
9. ClipDrawable
可以根据自己当前的等级来裁剪另一个Deawable,裁剪的方向可以通过android:clipOrientation和android:gravity这两个属性来共同控制
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="vertical"
android:drawable="@drawable/image1"
android:gravity="bottom" />
自定义Drawable
- Drawable的工作原理核心是Draw方法,其中
setAlpha
、setColorFilter
、getOpactity
是必须实现的 - Drawable的内部大小不等于Drawable的实际区域大小,Drawable的实际区域大小可以通过它的getBounds方法来得到,一般来说它和view的尺寸相同。
参考: Android Drawable 那些不为人知的高效用法
Android样式的开发:shape篇
Android样式的开发:layer-list篇
Android样式的开发:selector篇
Android样式的开发:drawable汇总篇
Android样式的开发:Style篇