• Android开发艺术探索学习笔记(六)


    第六章 Android的Drawable

          Drawable的优点:使用简单,比自定义view的成本要低;非图片类型的Drawable占用空间小,有利于减小APK安装包的大小。

        6.1Drawable简介

        Drawable有很多种,他们都表示一种图像的概念,Drawable常被用来作为view的背景使用。Drawable是一个抽象类。Drawable的内部宽高这个参数比较重要,通过getIntrinsicWidth和getIntrinsicHeight这两个方法可以获取到他们。但并不是所有的Drawable都有内部宽高。

        6.2Drawable的分类

          6.2.1 BitmapDrawable

          BitmapDrawableb表示一张图片,下面是其常用的属性(xml格式的描述方式)     

    <?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@mipmap/ic_launcher"
        android:antialias="true|false"
        android:dither="true|false"
        android:filter="true|false"
        android:gravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal|fill_horizontal|center|fill|clip_vertical|clip_horizontal"
        android:mipMap="true|false"
        android:tileMode="disabled|clamp|repeat|mirror"/>

          android:src  图片的资源ID,必有的属性。

          android:antialias  抗锯齿功能

          android:dither 抖动效果(优化图片显示效果的作用)

          android:filter 过滤效果(优化图片显示效果的作用)

          android:gravity 定位图片

          android:mipMap 纹理映射(不常用)

          android:tileMode 平铺模式(当开启这个模式时,gravity属性会被忽略)共有四种模式:disabled——关闭平铺模式;repeat——水平和垂直方向上的平铺效果;clamp——图片四周的像素会扩展到周围区域。mirror——水平和垂直方向上的镜面投影效果。

         NinePatchDrawable表示.9格式的图片,xml格式描述如下:

    <?xml version="1.0" encoding="utf-8"?>
    <nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@mipmap/ic_launcher"
        android:dither="true|false"/>

          6.2.2 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:bottomLeftRadius="integer"
            android:bottomRightRadius="integer"
            android:radius="integer"
            android:topLeftRadius="integer"
            android:topRightRadius="integer" />
        <gradient
            android:angle="integer"
            android:centerColor="integer"
            android:centerX="integer"
            android:centerY="integer"
            android:endColor="color"
            android:gradientRadius="integer"
            android:startColor="color"
            android:type="linear|radial|sweep"
            android:useLevel="true|false" />
        <padding
            android:bottom="integer"
            android:left="integer"
            android:right="integer"
            android:top="integer" />
        <size
            android:width="integer"
            android:height="integer" />
        <solid android:color="color" />
        <stroke
            android:width="integer"
            android:color="color"
            android:dashGap="integer"
            android:dashWidth="integer" />
    
    </shape>

          android:shape  图形形状:rectangle(矩形)、oval(椭圆)、line(横线)、ring(圆环),默认矩形,line和ring必须有<stroke>标签

          <corners>  四个角的角度,只适用于矩形

          <gradient>  渐变效果,与<solid>标签互斥

          <solid>  纯色填充

          <stroke>  描边

          <padding>  包含它的View的空白

          <size>  shape的大小,表示shape的固有大小,并不代表最终显示大小。

          6.2.3 LayerDrawable

           LayerDrawable代表层次化的Drawable集合,用来实现叠加效果。

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:drawable="@mipmap/ic_launcher"
            android:id="@+id/drawable"
            android:top="dimension"
            android:right="dimension"
            android:bottom="dimension"
            android:left="dimension">
        </item>
    </layer-list>

          一个<layer-list>可以包含多个item,每个item表示一个drawable,下面的item会覆盖上面的item,通过合理的分层,可以实现一些特殊的叠加效果。下面的例子实现了一种微信中的文本输入框效果

    <?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="#0ac39e" />
            </shape>
        </item>
        <item android:bottom="6dip">
            <shape android:shape="rectangle">
                <solid android:color="#ffffff" />
            </shape>
        </item>
        <item
            android:bottom="1dp"
            android:left="1dp"
            android:right="1dp">
            <shape android:shape="rectangle">
                <solid android:color="#ffffff" />
            </shape>
        </item>
    
    </layer-list>

          6.2.4 StateListDrawable            

          主要用于设置可单击的View的背景,最常见的是Button,对应于<selector>标签。XML格式如下:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android"
        android:constantSize="true|false"
        android:dither="true|false"
        android:variablePadding="true|false">
        <item
            android:drawable="@mipmap/ic_launcher"
            android:state_pressed="true|false"
            android:state_focused="true|false"
            android:state_selected="true|false"
            android:state_checked="true|false"
            android:state_enabled="true|false"
            />
    
    </selector>

            item有很多状态,以上只列取了几种常见的状态。

          android:constantSize StateListDrawable的固有大小是否不随着其状态的改变而改变。

          android:dither 是否开启抖动效果

          android:variablePadding StateListDrawable的padding是否随着其状态的改变而改变。

          android:state_pressed 按下状态

          android:state_focused 获取焦点

          android:state_selected 选择

          android:state_checked 选中

          android:state_enabled 可用     

            默认的item一般放在selector的最后一条并且不附带任何状态。

          6.2.5 LevelListDrawable

          Drawable集合,每个Drawable都有一个等级,根据不同的等级,LevelListDrawable会切换对应的Drawable。xml格式的语法如下:

    <?xml version="1.0" encoding="utf-8"?>
    <level-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:drawable="@mipmap/ic_launcher"
            android:maxLevel="integer"
            android:minLevel="integer" />
    
    </level-list>

          等 级范围:0~10000,作为View的背景时,可以通过Drawable的setLevel方法来设置不同的等级从而切换具体的Drawable;作为 ImageView的前景Drawable,可以通过ImageView的setImageLevel方法来切换Drawable。

          6.2.6  TransitionDrawable

          实现两个Drawable之间的淡入淡出效果,对应于<transition>标签,XML格式语法如下:

    <?xml version="1.0" encoding="utf-8"?>
    <transition xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:drawable="@mipmap/ic_launcher"
            android:id="@+id/resource_name"
            android:top="dimension"
            android:bottom="dimension"
            android:left="dimension"
            android:right="dimension"
            />
    </transition>

          实例:切换TextView的背景

    <?xml version="1.0" encoding="utf-8"?>
    <transition xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@mipmap/drawable1" />
        <item android:drawable="@mipmap/drawable2" />
    </transition>
      <TextView
            android:background="@drawable/test9"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
            TextView textView=(TextView)findViewById(R.id.test);
            TransitionDrawable drawable=(TransitionDrawable)textView.getBackground();
            drawable.startTransition(1000);

          6.2.7  InsetDrawable

          可以将其他Drawable内嵌到自己当中,对应于<inset>标签,当一个View希望自己的背景比自己的实际区域小的时候可以采用InsetDrawable来实现。XML格式语法如下:

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

          6.2.8  ScaleDrawable

          根据自己的等级将指定的Drawable缩放到一定比例;对应于<scale>标签。XML语法如下:

    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@mipmap/ic_launcher"
        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"/>

          使用时还需要设置ScaleDrawable的等级大于0且小于10000的值,否则看不到效果

            ScaleDrawable scaleDrawable=(ScaleDrawable)textView.getBackground();
            scaleDrawable.setLevel(1);

           6.2.9   ClipDrawable

          根据自己当前的等级来裁剪另一个Drawable,裁剪方向通过android:clipOrientation和android:gravity这两个属性来共同控制。XML属性语法如下:

    <?xml version="1.0" encoding="utf-8"?>
    <clip xmlns:android="http://schemas.android.com/apk/res/android"
        android:clipOrientation="horizontal|vertical"
        android:drawable="@mipmap/ic_launcher"
        android:gravity="top|bottom|left|right|center_vertical|fill_vertical|center_horizontal|fill_horizontal|center|fill|clip_vertical|clip_horizontal" />

          等级范围也是0~10000,0表示完全裁剪,10000表示不裁剪。

       ClipDrawable clipDrawable=(ClipDrawable)textView.getBackground();
       clipDrawable.setLevel(5000);

        6.3 自定义Drawable     

        只有某些特殊情况下才会用到,注意getIntrinsicWidth和getIntrinsicHeight这两个方法(p262)。

  • 相关阅读:
    IO 输入输出流
    「做自己」​​​​​​​写出我心(八十)
    「关于爱情,关于婚姻」​​​​​​​写出我心(七十九)
    「如何冥想?」​​​​​​​写出我心(七十八)
    「对这个世界温柔一点」​​​​​​写出我心(七十七)
    「7tips-克服焦虑」​​​​​写出我心(七十六)
    「十步学习法」​​​​写出我心(七十五)
    「成功的人生是台阶式向上」​​​写出我心(七十四)
    「世界是自己的」​​写出我心(七十三)
    「​八点工作中的小建议」​写出我心(七十二)
  • 原文地址:https://www.cnblogs.com/shiwei-bai/p/5105401.html
Copyright © 2020-2023  润新知