Android 开发杂记(二)

723 阅读3分钟

Android的Drawable

概念

  • Andoird中的Drawable表示的是图像的概念,不等于具象的图片,也可以是颜色,形状...

  • Drawable可以使用XML定义或者使用代码定义;

  • Drawable是一个抽象类,每一个具体的Drawable都是其的子类,如ShapeDrawable,BitmapDrawable...

Drawable的宽/高

Drawable可以使用getIntrinsicHeight()或者使用getIntrinsicWidth()获取它的内部长度和内部宽度; 并不是所有的Drawable都有高宽,图片Drawable的内部高宽就是其内部图片的长宽,颜色Drawable则没有高宽的概念;

Drawable自身没有宽高概念,当它作为View的背景时,将会被拉伸至View的同等大小;

常见的Drawable

BitmapDrawable

BitmapDrawable表示的是一张图片,通过XML定义它可以设置很多效果,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    android:mipMap="true|fase" //纹理映射 不常用
    android:src="" //图片的资源Id
    android:antialias="" //是否开启图片的抗锯齿
    android:dither="true|fase" //自适应 当图片的原本色彩模式和当前机型兼容的色彩模式不兼容时,可以减少失真
    android:filter="true|fase"//过滤 用于优化图像被拉伸或者压缩后的显示效果
    android:gravity="" //图片的定位
    android:tileMode="" //无法充满时的填充模式 和gravity互斥
    xmlns:android="http://schemas.android.com/apk/res/android">
</bitmap>

NinePathDrawable和BitmapDrawable类似

<?xml version="1.0" encoding="utf-8"?>
<nine-patch
    android:mipMap="true"
    android:src=""
    android:alpha=""
    android:dither=""
    android:filter=""
    android:gravity=""
    android:antialias=""
    android:tileMode=""
    xmlns:android="http://schemas.android.com/apk/res/android">

</nine-patch>

但表示的是.9图,BitmapDrawable同样可以使用.9图,且代表一个.9图;

ShapeDrawable

ShapeDrawable表示的包含颜色的图形,整个图形可以是纯色的,也可以是渐变的;

<?xml version="1.0" encoding="utf-8"?>
<shape
    android:shape="oval|line|rectangle|ring"
    xmlns:android="http://schemas.android.com/apk/res/android">
    
<corners
    android:radius=""
    android:bottomLeftRadius=""
    android:topLeftRadius=""
    android:topRightRadius=""
    android:bottomRightRadius=""
    />
    

<gradient
    android:angle=""
    android:centerX=""
    android:centerY=""
    android:startColor=""
    android:centerColor=""
    android:endColor=""
    android:gradientRadius=""
    android:type=""
    />
    

<solid android:color=""/>

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

</shape>
  • android:shape

表示的是整个图形的形状,有oval(圆形),line(线),rectangle(矩形),ring(圆环)四种形状,默认为矩形;line和ring必须配合<stroke>来指定宽度和颜色,否则无法达到预期效果;

对于ring,有五个特殊的属性

android:innerRadius="" 圆环内圆半径 优先级高于innerRadiusRatio
android:innerRadiusRatio="x" 内径占比 内半径 = 宽度/x
android:thicknessRatio="" 内半径占整个Drawable宽度的比例
android:thickness="" 圆环厚度 优先级高于thicknessRatio
android:useLevel="" 一般为false 除非作为LevelDrawable来使用
  • <corners>

用于表示边角的角度

android:radius="" 优先级最低 全局的边角角度
android:bottomLeftRadius="" 左下的角度
android:topLeftRadius="" //左上的角度
android:topRightRadius="" //右上的角度
android:bottomRightRadius="" //右下的角度
  • <gradient>

与<solid>标签互斥,表示渐变填充,拥有的属性如下

<gradient
    android:angle="" 渐变角度 默认为0 必须为45的倍数
    android:centerX="" 渐变中心点的x坐标
    android:centerY="" 渐变中心点的y坐标
    android:startColor="" 渐变的起始色
    android:centerColor="" 渐变的中心色
    android:endColor="" 渐变的结束色
    android:gradientRadius="" 渐变半径
    android:type="" //渐变的类型 linear(线性,默认)|radial(径向渐变)|sweep(扫描线渐变)
    />
  • <solid>

表示纯色填充 通过android:color可指定颜色

  • <stroke>

描边,属性描述如下

<stroke
    android:color="" 描边的颜色
    android:dashGap="" 组成虚线的线段之间的距离
    android:dashWidth="" 线段宽度
    android:width="" 描边的宽度
 />
  • <padding> 表示留白,通过android:left,android:right,android:top,android:bottom表示四个方向的padding

  • <size>

表示的是这个形状的固有大小,getIntrinsicHeight()或者使用getIntrinsicWidth()即可获得这个值,但是shape本身是没有宽高概念的,设置为View背景依旧会被拉伸成View的大小,如果不设置size,我们通过getIntrinsicHeight()或者使用getIntrinsicWidth()获取的值为-1;

LayerDrawable

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    android:shape="ring"
    android:innerRadius=""
    android:innerRadiusRatio=""
    android:thicknessRatio=""
    android:thickness=""
    android:useLevel=""
    xmlns:android="http://schemas.android.com/apk/res/android">

  <item 
      android:height=""
      android:width=""
      android:right=""
      android:left=""
      android:top=""
      android:bottom=""
      android:gravity=""
      android:id=""
      android:drawable=""
      android:end=""
      android:start=""
      >
      ...其他Drawable
  </item>

    <item>

  ...其他Drawable

    </item>

</layer-list>

表示的是层级化的Drawable集合,可以把不同的drawable放在内部的item标签中,从而达到一种叠加后效果,通过item的子属性可以对内部的drawable进行定位,内部的drawable都会缩放至view的实际大小,根据item的位置,越下面声明的item,显示优先级越高;

StateListDrawable

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:dither="true">
    <item android:drawable="@drawable/ic_ti_reset_enabled"

        android:state_enabled="true" />
    <item android:drawable="@drawable/ic_ti_reset_disenabled" android:state_enabled="false" />
</selector>

StateListDrawable对应<selector>,内部每个Drawable对应的不同状态下的View显示Drawable背景; 状态集合如下:

属性值含义
android:state_active是否激活
android:state_checkable是否可勾选
android:state_checked是否已勾选
android:state_enabled是否可用
android:state_active是否激活
android:state_first是否在开始状态
android:state_focused是否获得焦点
android:state_last是否属于结束状态
android:state_middle是否属于中间状态
android:state_pressed是否按下
android:state_selected是否选中
android:state_window_focused是否窗口获得焦点

LevelListDrawable

LevelListDrawable对应的标签为<level-list>,内部每个item可以表示一个drawable,并且有对应的等级范围,使用此drawable做背景的时候,可以使用setLevel方法设置不同的等级从而切换具体的drawable,但等级的数值是有限制的最大10000,最小0

<?xml version="1.0" encoding="utf-8"?>
<level-list
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:maxLevel="100"
        android:minLevel="1"
        android:drawable=""
        />

</level-list>

TransitionDrawable

对应的标签为<transition>,内部item可以指定drawable和进行内部定位,可以通过 drawable.startTransition()drawable.reverseTransition()进行顺序动画或者逆向动画

image.png