《Android开发艺术探索》笔记(六)——Drawable

《Android开发艺术探索》笔记(六)——Drawable

作者:cmad 时间:2016-05-17 分类:Android 评论:0条 浏览:266



  Drawable有很多种,它们都表示一种图像的概念,但是它们又不全是图片,通过颜色也可以构造出各种各样的图像的效果。在实际开发中Drawable常用来作为View的背景使用。Drawable一般都是通过xml来定义的,当然也可以通过代码来定义,不过比较复杂一般不考虑。

  Drawable的内部宽高这个参数比较重要,通过getIntrinsicWidth和getIntrinsicHeight这两个方法可以获取。但是并不是所有的Drawable都有内部宽高,比如一张图片所形成的Drawable,它的内部宽高就是图片的宽高,但是一个颜色所形成的Drawable它就没有内部宽高的概念。需要注意的是,Drawable的内部宽高不等于它的大小,一般来说Drawable是没有大小的概念的,当作用View的背景时,Drawable会被拉伸至View的同等大小。

下面介绍几种常见的Drawable。

BitmapDrawable

  最常见也是最简单的Drawable,直接引用图片进行构建,通过xml的方式来描述它:

<bitmap android:src="@mipmap/ic_launcher"
android:antialias="true"
android:dither="true"
android:filter="true"
android:gravity="bottom"
android:mipMap="false"
android:tileMode="repeat"/>

  下面是它各个属性介绍。

  • src

    这个很简单,就是图片的资源id
  • antialias

    是否开启图片的抗锯齿功能。开启后会让图片变得平滑,同时也会有一定程度上降低图片的清晰度,但是这个降低的幅度较低以至于可以忽略,因此抗锯齿选项应该开启。
  • dither

    是否开启抖动功能。当图片的像素配置和手机屏幕的像素配置不一致时,开启这个选项可以让高质量的图片在低质量的屏幕上还能保持较好的显示效果,比如图片的色彩模式是ARGB8888,但是屏幕所支持的是RGB555,这个时候开启抖动选项可以让图片不会过于失真。所以应该开启此项。
  • filter

    是否开启过滤效果。当图片尺寸被拉伸或者压缩时,开启此项可以保持较好的显示效果,应该开启。
  • gravity

    当图片小于容器的尺寸时,设置此项可以对图片进行定位,这个属性的可选项比较多,不同的选项可以通过“|”来组合使用。
  • mipMap

    这是一种图像相关的处理技术,也叫文理映射,默认值为false,在日常开发中不常用。
  • tileMode

    平铺模式。这个选项有四个值:disabled、clamp、repeat、mirror,其中disabled表示关闭平铺模式,也是默认值,当开启平铺模式后gravity属性会被忽略。repeat表示的是简单的水平和竖直方向上的平铺效果;mirror表示一种在水平和竖直方向上的镜面投影效果;clamp表示图片四周的像素会扩散到周围区域。

ShapeDrawable

  ShapeDrawable也是一种很常见的Drawable,对应xml描述的shape标签

<shape
android:shape="[rectangle|oval|line|ring]">


<corners
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer"/>


<gradient
android:angle="integer"
android:centerX="integer"
android:centerY="integer"
android:centerColor="color"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type="[linear|radial|sweep]"
android:useLevel="true"/>

<padding
android:left="5dp"
android:right="5dp"
android:top="5dp"
android:bottom="integer"/>


<size
android:width="integer"
android:height="integer"/>


<solid android:color="color"/>

<stroke
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer"/>

</shape>
  • shape

    表示图形的形状。rectangle矩形、oval椭圆、line横线、ring圆环。

corners

  表示shape四个角的角度,它适用于矩形shape,也就是矩形的圆角的角度。radius为四个角同时设定相同的角度,其他四个属性分别为对应角设置角度。

gradient

  渐变效果,跟solid标签是互斥的。

  • angle

    渐变的角度,默认为0,其值必须为45的倍数,0表示从左到右,90表示从上到下。
  • centerX、centerY

    渐变的中心点的横纵坐标
  • startColor、endColor

    渐变的起始和结束颜色
  • centerColor

    渐变的中间颜色
  • gradientRadius

    渐变半径,仅当type=“radial”时有效
  • useLevel

    一般为false,当Drawable作为StateListDrawable使用时为true。
  • type

    渐变类别,有linear(线性渐变)、radial(径向渐变)、sweep(扫描渐变)三种,默认为线性渐变。

solid

  这个标签标示纯色填充,通过android:color即可知道shape中填充的颜色。

stroke

  shape的描边。

  • width 描边的宽度
  • color 描边的颜色
  • dashWidth 组成虚线的线段宽度
  • dashGap 组成虚线的线段之间的间隔。

注意:如果dashWidth和dashGap有任何一个为0,那么虚线效果将不能生效。

padding

  标示View内容与本身的间隔,及内边距。

size

  shape的大小,有两个属性:width、height,分别标示shape的宽高。这个标示的shape的固有大小,但是一般来说它并不是shape的最终显示大小。这个两个的值对应Drawable的getIntrinsicWidth和getIntrinsicHeight的值。当shape作为背景的Drawable时shape还是会被拉伸或者缩小为View的大小。

LayerDrawable

  LayerDrawable对应XMl标签的layer-list,它标示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果。

<layer-list>
<item android:drawable="@drawable/drawable_resource"
android:id="@+id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension"/>

</layer-list>

  一个layer-list中可以包含多个item,每个item标示一个Drawable。Item的结构也比较简单,常用的属性有:top、bottom、left、right,它们分别表示Drawable相对于View的上下左右的偏移量。另外我们可以通过drawable直接引用一个已有的Drawable资源,也可以在item中自定义Drawable。默认情况下,layer-list中所有的Drawable都会被缩放至View的大小,对于bitmap来说需要使用gravity属性才能控制图片的显示效果。layer-list有层次概念,下面的item会覆盖上面的item,通过合理的分层,可以实现一些特殊的叠加效果。

StateListDrawable

  StateListDrawable对应于xml的selector标签,这在我们开发中是经常使用的,一般用来设置view不同状态下的不同背景。

<selector
android:constantSize="true"
android:dither="true"
android:variablePadding="true">

<item android:drawable="@drawable/drawable_resource"
android:state_pressed="true"/>

......

</selector>

  item标签表示一个具体的Drawable,其中drawable是一个已有的Drawable的资源id,剩下的属性表示View的各种状态,比如state_pressed表示按下状态。系统会根据View当前的状态从selector中选择对应的item,系统按照从上到下的顺序查找,直至找到第一条匹配的item,一般来说默认的item应该放在最后。

  下面介绍一下selector标签上的属性。

  • constantSize

    StateListDrawable的固定大小是否不随着其状态的改变而改变,因为状态的改变会导致StateListDrawable切换到具体的Drawable,而不同的Drawable具有不同的固有大小,True表示StateListDrawable的固有大小保持不变,这时它的固有大小是内部所有Drawable的固有大小的最大值,false则会随着状态改变而改变,此项默认false。
  • dither

    是否开启抖动效果,这个跟BitmapDrawable中提到的一样,默认为true。
  • variablePadding

    StateListDrawable的padding表示是否随着状态改变而改变,true表示会随着状态改变而改变,false表示StateListDrawable的padding是内容所有Drawable的padding的最大值。默认为false,不建议开启。

LevelListDrawable

  LevelListDrawable对应level-list 标签,它同样表示一个Drawable集合,集合中的每个Drawable都有一个等级(level)的概念。根据不同的等级,LevelListDrawable会切换为对应的Drawable。

<level-list>
<item
android:drawable="@drawable/drawable_resource"
android:maxLevel="integer"
android:minLevel="integer"/>

</level-list>

  每个item表示一个Drawable,并且有对应的等级范围,由minLevel和maxLevel来指定,在最小值和最大值之间的等级会对应此item中的Drawable。当它作为背景时可以通过Drawable的setLevel方法来设置不同的等级从而切换不同的Drawable。如果它被当做ImageView的前景Drawable,那么可以通过ImageView的setImageLevel方法来切换Drawable。Drawable的等级是有范围的0~10000,默认为0。

TransitionDrawable

  TransitionDrawable对应transition标签,用于实现两个Drawable之间的淡入淡出效果。

<transition>
<item android:drawable="@drawable/drawable_resource"
android:id="@+id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension"/>

</transition>

  xml里的描述跟LayerDrawable一样,item的属性在LayerDrawable中我们也介绍了。

  我们看一下当TransitionDrawable作为View的背景时我们在代码里怎么使用:

TextView textView = findViewById(R.id.test_transition);
TransitionDrawable drawable = (TransitionDrawable) textView.getBackground();
drawable.startTransition(1000);

  通过getBackground获得Drawable再转化为TransitionDrawable ,然后调用TransitionDrawable 的startTransition方法传入动画时间开始动画效果。

InsetDrawable

  InsetDrawable对应inset标签,它可以将其他Drawable内嵌到自己当中,并可以在四周留出一定的距离。当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现。

<inset
android:drawable="@drawable/drawable_resource"
android:insetTop="dimension"
android:insetBottom="dimension"
android:insetLeft="dimension"
android:insetRight="dimension"/>

  insetTop、insetBottom、insetLeft、insetRight分别表示顶部、底部、左边、右边的内凹大小。

ScaleDrawable

  ScaleDrawable对应scale标签,它可以根据自己的等级将指定的Drawable缩放到一定比例。

<scale
android:drawable="@drawable/drawable_resource"
android:scaleGravity="top"
android:scaleHeight="percentage"
android:scaleWidth="percentage"/>

  scaleGravity的含义等同于shape中的gravity,而scaleWidth和scaleHeight分别表示对指定的Drawable宽和高的缩放比例,以百分比表示。

  需要注意的是ScaleDrawable等级为0的时候ScaleDrawable是不可见的,如果要使用ScaleDrawable必须设置它的等级大于0。如果ScaleDrawable等级为10000则没有缩放效果;如果ScaleDrawable的级别越大内部Drawable看起来越大;如果ScaleDrawable的xml定义的缩放比例越大,则内部的Drawable看起来就越小。

ClipDrawable

  ClipDrawable对应clip标签,它可以根据自己当前的等级来裁剪另一个Drawable,裁剪方向可以通过clipOrientation和gravity这两个属性来共同控制。

<clip
android:drawable="@drawable/drawable_resource"
android:clipOrientation="horizontal"
android:gravity="bottom"/>

  其中clipOrientation表示裁剪方向,有水平和竖直方向,gravity需要和clipOrientation一起才能发挥作用,gravity选项可以通过“|”来进行组合。

  Drawable的等级范围是0~10000,ClipDrawable等级为0表示完全裁剪,10000表示不裁剪,8000表示裁剪2000即20%,5000表示裁剪了5000即50%,以此类推。  


相关推荐
更多

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>