美文网首页
Android开发六《Android的Drawable》

Android开发六《Android的Drawable》

作者: 独自闯天涯的码农 | 来源:发表于2022-03-24 12:18 被阅读0次

    一、Drawable简介

    Drawable有很多种,他们都表示一种图像的概念,通过XML文件来定义,是一个抽象类,是所有具体的Drawable对象的基类.
    Drawable的内部宽高参数比较重要:
    getIntrinsicWidth()获取宽
    getIntrinsicHeight()获取高
    内部是图片形成的Drawable才有,如果只是颜色形成的则没有宽高概念;

    二、Drawable的分类

    1、BitmapDrawable

    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:alpha="10"
        android:antialias="true"
        android:autoMirrored="true"
        android:dither="true"
        android:filter="false"
        android:gravity="center"
        android:mipMap="true"
        android:src="@drawable/logo"
        android:tileMode="repeat"
        android:tileModeX="repeat"
        android:tileModeY="mirror"
        android:tint="@color/colorAccent"
        android:tintMode="screen">
    </bitmap>
    

    src:图片资源id
    alpha:设置图片的透明度,取值范围为0.0~1.0之间,0.0为全透明,1.0为全不透明
    antialias:抗锯齿
    autoMirrored:设置图片是否需要镜像反转,当布局方向是RTL,即从右到左布局时才有用,API Level 19(Android 4.4)才添加的属性
    dither:防抖动
    filter:设置是否允许对图片进行滤波,对图片进行收缩或者延展使用滤波可以获得平滑的外观效果
    gravity:对齐方式
    mipMap:纹理映射
    =============================
    tileMode:平铺方式
    平铺(repeat),镜像(mirror),扩展像素(clamp)
    tileModeX:x方向平铺方式
    tileModeY:y方向平铺方式
    ==============================
    tint:着色
    tintMode:着色方式,5.0以后才有

    注意:NinePatchDrawable

    2、ShapeDrawable

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:dither="true"
        android:innerRadius="50dp"
        android:innerRadiusRatio="9"
        android:shape="ring"
        android:thickness="10dp"
        android:thicknessRatio="3"
        android:tint="@color/colorAccent"
        android:tintMode="add"
        android:useLevel="false"
        android:visible="true">
        <stroke
            android:width="5dp"
            android:color="@color/colorPrimaryDark" />
    </shape>
    

    shape:图形形状 rectangle(矩形)、oval(椭圆)、line(横线)、ring(环)
    userLeavel:一般为false,否则没有效果
    visible:是否显示
    dither:抖动
    ================
    tint|tintMode 着色
    ================
    innerRadius:内环大小
    thickness:环的厚度(内环+厚度=环的直径)
    innerRadiusRatio:内半径占整个Drawable宽度的比例,默认为9
    thicknessRatio:厚度占整个Drawable宽度的比例
    =============================
    shape必须通过stroke(边框)或者solid(实心)或者gradient(渐变)指定颜色

    solid: 实心颜色,同gradient互斥;
    stroke:边框
    width:边框宽度
    color:边框颜色
    dashGap:虚线间隔
    dashWidth:虚线宽度
    corners:边角
    radius:圆角半径,其他四个角的半径
    gradient:渐变。渐变和solid是互斥的,solid是纯色,gradient是渐变。
    angle:渐变的角度,默认为0,其值必须是45的倍数,0从左到右,90表示从下到上,180表示从右到左,顺时针顺序。
    centerX,centerY:渐变的中心点
    startColor,centerColor,endColor
    type:渐变的类别,line(线性)/radial(径向)/sweep(扫描)
    gradientRadius:渐变半径,仅当type为径向时有效
    padding:不是shape的padding,而是包含它的View的padding。
    size:这个表示shape的固有大小,但不是shape最终显示大小。shape没有宽高概念,作为View的背景会自适应View的宽高,对于图片Drawable,它的固有宽高就是图片尺寸,对于shapeDrawable,他没有固定宽高的概念,这个时候getIntrinsicWidht和getIntrinsicHeight会返回-1,但如果通过size标签来指定宽高信息,那么这个shapeDrawable就有固定宽高了,但作为View的背景,还会被拉伸或者缩小到Veiw的大小。

    3、LayerDrawable

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <shape android:shape="rectangle">
                <solid android:color="#456789" />
            </shape>
        </item>
        <item
            android:bottom="3dp"
            android:left="3dp"
            android:right="3dp">
            <shape>
                <solid android:color="#ffffff" />
            </shape>
        </item>
        <item android:bottom="16dp">
            <shape>
                <solid android:color="#ffffff" />
            </shape>
        </item>
    </layer-list>
    

    layer-list可以包含item,item可以包含shape
    bottom,left,top,right等可以理解为padding属性
    layer-list可以理解为frameLayout
    item可以有自己的drawable属性

    4、StateListDrawable

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/shape_oval" 
            android:state_checked="true" 
            android:state_enabled="true" 
            android:state_first="true" 
            android:state_last="true" 
            android:state_middle="true" 
            android:state_pressed="true" 
            android:state_selected="true" />
        <item android:drawable="@drawable/shape_ring" />
    </selector>
    

    state_checked:view是否checked
    state_enabled: View是否可以
    state_first: View是否处于开始状态
    state_last|state_middle: View是否处于中间状态|是否处于结束状态
    state_pressed: View是否被按下
    state_selected: View是否被选中
    注意:系统按照从上往下的顺序查找,知道找到匹配的第一条Item;

    5、LevelListDrawable

    <level-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:drawable="@drawable/shape_oval"
            android:maxLevel="2"
            android:minLevel="2" />
        <item
            android:drawable="@drawable/shape_ring"
            android:maxLevel="1"
            android:minLevel="1" />
        <item android:drawable="@drawable/shape" />
    </level-list>
    

    level-list表示一个Drawable集合,集合中每个Drawable都有一个等级的概念,等级不同,显示不同的Drawable。
    等级在minLevel和maxLevel之间的Drawable会被显示。
    如果level为2,而item1的maxLevel为2,而item2的minLevel为2,则maxLevel优先,显示item1.
    drawable的等级是有范围的0-10000是,0是默认值。

    6、TransitionDrawable

    <transition xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/shape_oval" />
        <item android:drawable="@drawable/shape" />
    </transition>
    

    ransitionDrawable是LayerDrawable的子类,本身就支持多item。
    它实现两个Drawable切换时的淡入淡出。

    7、InsetDrawable

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

    将其他Drawable内嵌到自己当中,并可以在四周留出一定的间距
    insetTop, insetRight, insetBottom, insetLeft表示内凹的大小,即间距

    8、ScaleDrawable

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

    scaleWidth 、scaleHeight:宽高缩放比例,百分比
    注意:level必须大于0才可以显示;

    9、ClipDrawable

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

    根据自己当前的等级level来裁剪另一个Drawable,裁剪方向可以通过:
    clipOrientation、gravity来控制;
    裁剪比例由level来控制,0表示完全裁剪,10000表示不裁剪;

    三、自定义Drawable

    Drawable使用范围:
    一个是作为ImageView的图像来显示;
    一个是作为View的背景来显示;

    自定义Drawable主要通过draw方法来绘制View的背景

    相关文章

      网友评论

          本文标题:Android开发六《Android的Drawable》

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