最全Drawable基础总结

作者: Troll4it | 来源:发表于2018-04-29 22:18 被阅读31次

    小编阅读后达到的成效与待加强地方:

    • 对Drawable有了更加全面的认知,每种Drewable都能熟练的使用
    • 待加强对自定义Drawable的了解

    Drawable在Android开发中最常见的,可能大家最熟悉的就是ShapeDrawable,StateListDrawable一个状态,一形状的,其实还有几种

    Drawable.jpg
    图像不清晰的请移步,下载原Xmind
    同时以下所有类型的例子都在github上有demo可以两者结合阅读
    先看下相应的demo图
    drawable_demo.jpg

    BitmapDrawable

    表示一张图片
    语法:

    <?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:antialias="true"
        android:dither="true"
        android:filter="true"
        android:gravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal
                         |fill_horizontal|center|fill|clip_vertical|clip_horizontal"
        android:src="@drawable/image" 
        android:mipMap="true"
        android:tileMode="clamp|disabled|repeat|mirror">
    
        </bitmap>
    
    属性 介绍
    android:src 图片的id
    android:antialias 是否图片抗锯齿功能
    android:dither 是否开启抖动效果
    android:filter 是否过滤效果
    top 将内部的Drawable放在容器的顶部,不改变其大小,如果为竖直裁剪,则从底部开始裁剪
    bottom 将内部的Drawable放在你容器的底部,不改变其大小。如为竖直裁剪,则从顶部开始裁剪
    left 将内部的Drawable放在容器的左边,不改变其大小。如为水平裁剪,则从右边开始后裁剪
    right 将内部的Drawable放在容器的右边,不改变其大小。如为竖直裁剪,则从左边开始裁剪
    center_vertical 将内部的Drawable放在容器的竖直中心,不改变其大小,如为竖直裁剪,那么上下同时开始裁剪
    fill_vertical 将内部的Drawable在竖直方向向上填充容器, 如果为竖直裁剪,那么仅当ClipDraewable的等级为0(0表示ClipDrawable被完全裁剪)时才有裁剪行为
    center_horizontal 使内部的Drawable在容器中水平居中,不改变它的大小,如果为水平裁剪,那么从左右两边同时开始裁剪
    fill_horizontal 使内部的Drawable在水平方向上填充容器,如果为水平裁剪,那么仅当ClipDrawable的等级为0时,才会有裁剪行为
    center 使内部的Drawable在容器中水平和竖直方向都居中,不改变其大小,如果为竖直裁剪,那么从上下同时开始裁剪;如果为水平裁剪,那么从左右同时裁剪
    fill 是内部的Drawable在水平和竖直方向上同时填充容器。仅当ClipDrawable的等级为0时,才能有裁剪行为
    android:mipMap 图像相关的处理技术,纹理映射
    android:tileMode 平铺模式

    ShapeDrawable

    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
            android:radius="10dp"
            android:topLeftRadius="5dp"
            android:topRightRadius="5dp"
            android:bottomLeftRadius="5dp"
            android:bottomRightRadius="5dp"/>
        <gradient
            android:angle="45"
            android:centerX="5px"
            android:centerY="5px"
            android:centerColor="@color/colorAccent"
            android:endColor="@color/colorPrimary"
            android:startColor="@color/colorPrimaryDark"
            android:gradientRadius="5dp"
            android:type="linear|radial|sweep"
            android:useLevel="true"/>
        <padding
            android:left="5dp"
            android:top="5dp"
            android:right="5dp"
            android:bottom="5dp"/>
        <solid
            android:color="@color/colorPrimaryDark"/>
        <size
            android:width="40dp"
            android:height="40dp"/>
        <stroke
            android:width="40dp"
            android:color="@color/colorAccent"
            android:dashGap="4dp"
            android:dashWidth="4dp"/>
    
    </shape>
    

    相应属性解释:

    属性 介绍
    android:shape 图形的形状:rectangle(矩形),oval(椭圆),line(横线),ring(圆形),默认值矩形;

    <ring>特有属性:

    属性 介绍
    android:innerRadius 圆环的内半径
    android:thickness 圆环厚度
    android:innerRadiusRatio 内半径占整个Drawable宽度的比例,默认为9
    android:thicknessRatio 厚度占整个Drawable宽度的比例,默认为3
    android:useLevel 一般都是false,当在LevelListDrawable(文章后期会介绍)中使用

    <corner>特有属性(用px)

    属性 介绍
    android:radius 四个角设置相同的角度
    android:topLeftRadius 设置最上角的角度
    android:topRightRadius 设置右上角的角度
    android:bottomLeftRadius 设置最下角的角度
    android:bottomRightRadius 设置右下角的角度

    <gradient>属性(渐变效果):与<solid>(纯色填充)标签相互排斥

    属性 介绍
    android:angle 渐变角度,默认为0,其值必须为45的度数,0表示从左到右,90表示从下到上
    android:centerX 渐变的中心点的横坐标
    android:centerY 渐变的中心点的纵坐标,渐变的中心点,渐变的中心点会影响渐变的具体效果
    android:startColor 渐变的起始色
    android:centerColor 渐变的中间色
    android:endColor 渐变的结束色
    android:gradientRadius 渐变半径,仅当android:type="radial"时有效
    android:useLevel 一般为fasle,当Drawable作为StateListDrawable(后面会有详细介绍)使用时为true
    android:type 渐变的类别,有liner(有线性渐变),radial(径向渐变),sweep(扫描渐变),默认值为线性渐变
    属性 介绍
    android:color 填充的颜色

    <solid>纯色填充

    属性 介绍
    android:color 填充的颜色

    <stroke> Shape的描边

    属性 介绍
    android:width 描边的宽度
    android:color 描边的颜色
    android:dashWidth 组成虚线的线段宽度
    android:dashGap 组成虚线的线段之间的间隔,间隔越大则虚线之间的空隙越大

    <padding>属性 :android:left .android:top ,android:right ,android:bottom
    <size> 属性:android:width ,android:height

    LayerDrawable

    LayerDrawable对应的XML标签<layer-list>,表示一种层次化的Drawable集合,将不同的Drawable放置在不同的层上从而达到一种叠加后的效果。
    语法:

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item
            android:bottom="40dp"
            android:drawable="@drawable/image"
            android:left="40dp"
            android:right="40dp"
            android:top="40dp" />
    </layer-list>
    

    其中android:top,android:bottom,android:left,android:right表示四周的偏移量

    StateListDrawable

    StateListDrawable对应<selector> 标签,表示Drawable集合,每个Drawable都对应着View的一种状态,根据View的状态选择相应的Drawable;
    语法:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" 
                    android:constantSize="true" 
                    android:dither="true" 
                    android:variablePadding="true">
        <item android:drawable="@drawable/image" 
              android:state_activated="true"
              android:state_checkable="true" 
              android:state_checked="true" 
              android:state_enabled="true" 
              android:state_focused="true"
              android:state_hovered="true" 
              android:state_pressed="true" 
              android:state_selected="true" 
              android:state_window_focused="true" />
    
    </selector>
    

    相应的属性详解:

    属性 介绍
    android:constantSize StateListDrawable的固定大小是否随着其状态的改变而改变,默认为false
    android:dither 是否开启抖动效果,默认值为true
    android:variablePadding StateListDrawable 的padding表示是否随着其状态的改变而改变,默认值false
    android:state_pressed 表示按下状态
    android:state_focused 表示View已经获得焦点
    android:state_selected 表示用户选择了View
    android: state_checked 表示用户选中了View
    android:state_enabled 表示View当前处于可用状态

    LevelListDrawable

    LevelListDrawable对应于<level-list>标签,表示一个Drawable集合,集合中每个Drawable都有等级,根据不同的等级,LevelListDrawable会切换为对应的Drawable
    语法:

    <?xml version="1.0" encoding="utf-8"?>
    <level-list xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item
            android:drawable="@drawable/image"
            android:maxLevel="20"
            android:minLevel="10" />
        <item
            android:drawable="@drawable/image1"
            android:maxLevel="9"
            android:minLevel="1" />
    </level-list>
    

    maxLevel,minLevel设置等级最大最小值,会根据代码设置的相应的level切换相应的drawable

    TransitionDrawable

    TransitionDrawable对应于<transition>标签,实现Drawable之间的淡入淡出效果
    语法:

    <?xml version="1.0" encoding="utf-8"?>
    <transition xmlns:android="http://schemas.android.com/apk/res/android">
    
    
        <item
            android:width="40dp"
            android:height="40dp"
            android:bottom="40dp"
            android:drawable="@drawable/image"
            android:top="40dp" />
    </transition>
    

    其中android:top,android:bottom,android:left,android:right表示四周的偏移量

    InsetDrawable

    InsetDrawable对应<inset>标签,可以将其他Drawable内嵌到自己当中,并且四周留出一定的边界。
    语法:

    <?xml version="1.0" encoding="utf-8"?>
    <inset xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/image"
        android:insetBottom="40dp"
        android:insetLeft="40dp"
        android:insetRight="40dp"
        android:insetTop="40dp" />
    

    其中android:top,android:bottom,android:left,android:right表示四周的偏移量

    ScaleDrawable

    ScaleDrawable对应的标签为<scale>,可以根据自己的等级(level)将指定的Drawable缩放到一定比例。
    语法:

    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/image"
        android:scaleGravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal
    |fill_horizontal|center|fill|clip_vertical|clip_horizontal"  
        android:scaleHeight="50%"
        android:scaleWidth="50%" />
    

    android:scaleGravity等同于androiid:gravity,android:scaleHeight和android:scaleWidth分别表示对指定Drawable宽高的缩放比例,用百分比表示。

    ClipDrawable

    ClipDrawable对应于<clid>标签,根据自己的等级(level)来裁剪另一个Drawable,裁剪的方向根据属性android:clipOrientation和android:gravity两个属性共同决定的。其中clipOrientation表示裁剪方向,分为水平(horizontal)和竖直(vertical)方向

    语法:

    <clip xmlns:android="http://schemas.android.com/apk/res/android"
        android:clipOrientation="horizontal|vertical"
        android:drawable="@drawable/image"
        android:gravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal
                         |fill_horizontal|center|fill|clip_vertical|clip_horizontal" />
    
    选项 意义
    top 将内部的Drawable放在容器的顶部,不改变其大小,如果为竖直裁剪,则从底部开始裁剪
    bottom 将内部的Drawable放在你容器的底部,不改变其大小。如为竖直裁剪,则从顶部开始裁剪
    left 将内部的Drawable放在容器的左边,不改变其大小。如为水平裁剪,则从右边开始后裁剪
    right 将内部的Drawable放在容器的右边,不改变其大小。如为竖直裁剪,则从左边开始裁剪
    center_vertical 将内部的Drawable放在容器的竖直中心,不改变其大小,如为竖直裁剪,那么上下同时开始裁剪
    fill_vertical 将内部的Drawable在竖直方向向上填充容器, 如果为竖直裁剪,那么仅当ClipDraewable的等级为0(0表示ClipDrawable被完全裁剪)时才有裁剪行为
    center_horizontal 使内部的Drawable在容器中水平居中,不改变它的大小,如果为水平裁剪,那么从左右两边同时开始裁剪
    fill_horizontal 使内部的Drawable在水平方向上填充容器,如果为水平裁剪,那么仅当ClipDrawable的等级为0时,才会有裁剪行为
    center 使内部的Drawable在容器中水平和竖直方向都居中,不改变其大小,如果为竖直裁剪,那么从上下同时开始裁剪;如果为水平裁剪,那么从左右同时裁剪
    fill 是内部的Drawable在水平和竖直方向上同时填充容器。仅当ClipDrawable的等级为0时,才能有裁剪行为

    初写文章,大家请轻点喷QAQ
    最后感谢刚哥的Android开发艺术探索

    相关文章

      网友评论

        本文标题:最全Drawable基础总结

        本文链接:https://www.haomeiwen.com/subject/fhiolftx.html