玩转Android之Drawable的使用

1.概述

用过Drawable的都知道Drawable有很多种,有的时候Drawable是一张图片,有的时候Drawable是我们通过颜色构造出来的某种图形。
最常见的自己构造的Drawable图形莫过于ShapeDrawable,我们在开发中可能经常需要自己绘制一个矩形、圆形、椭圆等等各种各样的图形。
一般来说,Drawable并没大小的概念(虽然可以通过getIntrinsicHeight和getIntrinsicWidth两个方法获取Drawable的宽和高,但是这两个方法并不总是有效,因为如果我们的Drawable是图片的话,那么Drawable的大小就是图片的大小,如果我们的Drawable本身就是颜色的话,那么就没有宽高的概念)
因为我们在用Drawable的时候,大多数时候都是把它当作某一个控件的背景来使用的,此时Drawable会被拉伸到和View相同的大小,此时Drawable的大小实际上就是控件的大小。

2.在Drawable的这些继承类中我们常用的主要有以下几种:

1. LayerDrawable
2. ShapeDrawable
3. NinePatchDrawable
4. BitmapDrawable
5. StateListDrawable
6. LevelListDrawable
7. TransitionDrawable
8. InsetDrawable
9. ScaleDrawable
10.ClipDrawable

3.Drawable介绍:

3.1.BitmapDrawable

BitmapDrawable的构造,除了在代码中new一个BitmaDrawable之外,我们还可以使用XML来构造一个BitmapDrawable对象,在项目的drawable文件中新创建一个xml文件,代码如下:

示例:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:antialias="true"
        android:src="@drawable/a2w"
        android:dither="true"
        android:filter="true"
        android:gravity="top|left"
        android:tileMode="mirror"
    >
</bitmap>

属性:

  1. src 要显示的图片(必需)
  2. antialias 是否开启抗锯齿,在自定义View创建Paint时经常用到
  3. dither 是否开启抖动效果,作用是手机像素配置和图片像素配置不一致时,系统会自动调整显示效果
  4. filter 是否开启过滤效果,这个属性也是为了使图片被放大或者缩小时有一个较好的显示效果
  5. gravity 表示当图片的大小小于控件的大小时,图片的显示位置
  6. tileMode 表示平铺模式,在我们的Windows电脑桌面设置的时候就有这个选项,该属性共有四种取值,分别是disable、repeat、mirror、clamp四种,默认情况下是disable,就是不做任何处理,当我们在这里使用了除disable之外的另外三种取值时,gravity属性值失效。

3.2.ShapeDrawable

shape是一个根节点;在shape中写其他样式

示例:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle|oval|line|ring" >
<shape>

属性:

  1. android:shape 四种形状:rectangle(矩形,包括正方形),oval(椭圆,包括圆),line(线段),ring(环形),默认长方形
  2. android:innerRadius:内环的半径。
  3. android:innerRadiusRatio:内环的比例,比如这个值为2,那么内环的半径就为环半径除以2,如果设置了innerRadius,则这个属性不起作用。
  4. android:thickness:环的厚度。
  5. android:thicknessRatio:环的厚度比例,比如这个值为2,那么环的厚度就为环半径除以2,如果设置了thickness,则这个属性不起作用。
  6. android:useLevel:当shape为ring才有效,表示是否允许根据level来显示环的一部分
  7. android:visible 设置是否可见

圆角:

android:radius表示长方形四个角的半径,当然也可以每个角单独设定,后面单独设定的圆角半径会覆盖android:radius。

<corners 
    android:radius="20dp"
    android:topLeftRadius="20dp"
    android:topRightRadius="20dp"
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"/>

渐变:

<gradient
        android:angle="90"
        android:centerColor="#9ACD32"
        android:endColor="#9AC0CD"
        android:startColor="#9AFF9A"
        android:type="linear"
        android:useLevel="false" />
  1. android:angle 表示渐变的起始位置,只有linear类型的渐变才有效,表示渐变角度,这个值必须为45的倍数,包括0,0表示从左往右渐变,逆时针旋转,依次是45,90,135…,90表示从下往上渐变,270表示从上往下渐变。
  2. android:startColor 表示渐变的起始颜色
  3. android:centerColor 表示渐变的过渡颜色
  4. android:endColor 表示渐变的结束颜色
  5. type表示渐变的类型,有三种,分别是linear(线性变化),radial(辐射渐变),sweep(平铺渐变)
  6. android:gradientRadius 只有radial和sweep类型的渐变才有效,radial必须设置,表示渐变效果的半径
  7. centerX:渐变中间亚瑟的x坐标,取值范围为:0~1
  8. centerY:渐变中间颜色的Y坐标,取值范围为:0~1
  9. android:useLevel 判断是否根据level绘制渐变效果

填充:

背景填充色,设置solid后会覆盖gradient(渐变)设置的所有效果!!!

<solid android:color="#ADFF2F" />

描边:

<stroke 
    android:width="1dp"
    android:color="#FFFF00"
    android:dashWidth="15dp"
    android:dashGap="5dp"/>
  1. android:dashWidth 表示虚线的宽度
  2. android:dashGap 表示虚线之间的间隔
  3. 以上两个属性如果不设置则为实线
  4. android:width 边框的宽度
  5. android:color 边框的颜色

大小:

这个表示该shape的大小,默认情况下,shape的大小与它所在的容器大小成正比。如果我们在ImageView中使用这个shape,那么可以通过android:scaleType="center"属性来限制这种缩放

<size 
    android:width="1dp"
    android:height="1dp"/>

填充:

left,top,right,bottm:依次是左上右下方向上的边距!

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

3.3.LayerDrawable

LayerDrawable中可以有n多个item,每个item就是一个Drawable,每一个Drawable依据代码的顺序相互覆盖着显示出来。先写的先绘制,后写的后绘制,最终显示的效果是一个叠加的显示效果

示例:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <solid android:color="@color/lineColor"/>
    </shape>
</item>
    <item android:bottom="8dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/lineColor2"/>
        </shape>
    </item>
    <item android:bottom="1dp" android:left="1dp" android:right="1dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/etbg"/>
        </shape>
    </item>
</layer-list>

3.4.LevelListDrawable

LevelListDrawable,顾名思义就是一个等级Drawable,它就是根据控件的不同等级来切换Drawable,有点类似于selector中的根据控件的状态来更新Drawable。不同的是这里是根据控件的level来更新。状态改变用法类似于:setImageLevel(5);level的取值范围为0~10000,默认值为0。

示例:

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/p2"
        android:minLevel="0"
        android:maxLevel="10"/>
    <item
        android:drawable="@drawable/p1"
        android:minLevel="11"
        android:maxLevel="20"/>
</level-list>

3.5.TransitonDrawable

TransitionDrawable主要是实现两个Drawable之间淡入淡出的效果。
类似用法:

TransitionDrawable drawable = (TransitionDrawable) iv.getDrawable();
        drawable.startTransition(2000);

示例:

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/p1"/>
    <item android:drawable="@drawable/p2"/>
</transition>

3.6.InsetDrawable

InsetDrawable表示可以将一个Drawable嵌入到自己当中。类似的效果使用LayerDrawable也能实现

示例:

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:insetBottom="20dp"
       android:insetLeft="20dp"
       android:insetRight="20dp"
       android:insetTop="20dp">
    <shape android:shape="oval">
        <solid android:color="@color/colorAccent"/>
    </shape>
</inset>

3.7.ClipDrawable

表示根据一个Drawable的level对Drawable进行剪裁

示例:

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/p1"
    android:clipOrientation="horizontal"
    android:gravity="left">
</clip>

属性:

  1. drawable表示drawable图像,
  2. clipOrientation表示剪裁的方向,是从水平方向剪裁还是从垂直方向剪裁,这个属性配合gravity属性才会生效,至于每次剪裁的百分比则是和level属性的值有关,level属性的取值范围为0~10000,0表示完全剪裁,10000表示完全不剪裁,5000则表示剪裁一般,其它值依此类推。

猜你喜欢

转载自blog.csdn.net/weixin_46139477/article/details/126905325