android中常用的drawable

一 drawable描述

控件的绘制 可以在android项目的drawable目录下 配置 xml文件进行drawable定义

  以下是常用的drawable配置:

     shape 控件的圆角 背景 渐变 边框的设置 对应的类注释中存在对应标签的属性

            GradientDrawable绘制渐变

           ShapeDrawable 绘制渐变,边框 颜色,圆角等

     selector 控制不同状态下 控件的背景

          StateListDrawable 

      layerlist 图片的叠加

          LevelListDrawable

     animation-list 逐帧动画

         AnimationDrawable

      bitmap 创建可拉伸的矢量图

        BitmapDrawable

     clip 剪切图像

      ClipDrawable

二 对应drawable详解

1 shape配置 

   参考如下

2 selector配置

   android:state_pressed=["true" | "false"]  //被点击   
   android:state_focused=["true" | "false"]  //获得焦点   
   android:state_selected=["true" | "false"] //被选中   
   android:state_checkable=["true" | "false"] //可以被check时   
   android:state_checked=["true" | "false"]  //被check时,例如用于checkbox   
   android:state_enabled=["true" | "false"]  //可用时,即能接收click/touch事件   
   android:state_window_focused=["true" | "false"]  //所在的窗口获得焦点

  设置以上配置 可以当控件处于某种状态时显示某些背景 

  比如 在drawable下定义selector.xml内容如下:

   <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 触摸屏或者鼠标按下时触发  松开后 开事件消失 -->
    <item android:drawable="@drawable/button2" android:state_pressed="true"></item>
    <!-- 获取焦点的事件  一般都用于文本框 -->
    <item android:drawable="@drawable/button1" android:state_focused="true"></item>
    <item android:state_focused="true" android:drawable="@drawable/button3"></item>

    <!--这里表示默认的背景图片 一定要写在最下面 不然其他的状态都无效 -->
    <item android:drawable="@drawable/button3"></item>
</selector>

在文本框控件中:

   <EditText android:id="@+id/myText" android:layout_marginTop="10dp"  android:background="@drawable/selector" android:layout_width="100dp"
         android:layout_height="50dp"   android:layout_below="@id/btn1"/>

3 layerlist配置

   可以将两张图片叠加作为背景显示

   可以设置某些项的左右下上的距离

   <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <bitmap  android:src="@drawable/q1" android:antialias="true"/>
    </item>

   <!--第二张图片离左边的距离为100dp   bitmap默认会自动拉伸到控件的大小-->
    <item android:left="100dp">
         <bitmap  android:src="@drawable/ic_launcher" />
    </item>
</layer-list>

效果如下:


4 animation-list配置

   drawable目录下定义myaimation.xml  内容如下:

    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
        <item android:drawable="@drawable/q1" android:duration="150"/>
        <item android:drawable="@drawable/q2" android:duration="150"/>
        <item android:drawable="@drawable/q3" android:duration="150"/>
        <item android:drawable="@drawable/q4" android:duration="150"/>
     </animation-list>

     这里 android:oneshot="false" true表示是否只循环一次  如果为false表示 一直循环播放

定义了4个item 当调用播放时 先显示@drawable/q1图片  150ms后 执行@drawable/q2

当q4执行完后150秒 循环又开始播放q1

   布局中定义:

     <ImageView android:id="@+id/abc" android:layout_width="fill_parent" android:layout_height="90dp" 
        android:src="@drawable/myaimation"
        />
    <Button  android:id="@+id/btn"  android:layout_width="100dp" android:layout_height="50dp" android:text="播放" android:layout_below="@id/abc"/>
   ImageView 用于播放指定的animation-list  点击按钮后触发事件:

      ImageView iView=(ImageView)MainActivity.this.findViewById(R.id.abc);
     AnimationDrawable ad =(AnimationDrawable)iView.getDrawable();
     ad.start();

4 bitmap配置

   进行图片的一些简单操作 比如拉伸 滤波 去锯齿等

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_launcher"  --必须指定图片不能是xml文件
    android:antialias="true"  --锯齿
    android:filter="true"      --滤波
    android:gravity="right"    --右边对齐
     >

如果ImageView设置为长度100dp  bitmap本身设置的图片是50dp 那么图片会自动拉伸扩展到100dp 会出现模糊

可以使用android:gravity 表示图片不拉伸 自动填充到指定位置对齐 比如right  图片将位于控件右边 控件左边50dp就是空白

5 color配置

color标签是drawable里最简单的标签了,只有一个属性:android:color,指定颜色值。这个标签一般很少用,因为基本都可以通过其他更方便的方式定义颜色。另外,颜色值一般都在colors.xml文件中定义,其根节点为resources。看看两者的不同:


<!-- 文件:res/drawable/white.xml -->
<color xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#FFFFFF" />
<!-- 文件:res/values/colors.xml -->
<resources>
    <color name="white">#FFFFFF</color>
</resources>
引用的时候,前一种通过@drawable/white引用,后一种通过@color/white引用。

6 inset配置

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:visible="true"
    android:insetLeft="10dp"
    >
<shape>
    <padding android:left="50dp"/>
    <solid android:color="@android:color/holo_orange_light" />
</shape>
</inset>

inset 设置背景和控件的外边距 如果设置了 外边距就不会绘制背景图片  可以设置左右上下的距离

shape中的padding表示绘制内边距 这时内边距的部分也绘制了背景图片  这时光标就在内边距 +外边距之后

如果是 按钮 按钮的文本就鱼尾 外边距+内边距后面

图解:

文本框


按钮:


6 clip配置

使用剪切图像资源可以只显示一部分图像,这种资源经常被用在进度条的制作上。剪切图像资源是一个XML格式文件,资源只包含一个<clip>标签

举例:drawable下添加 myclip.xml

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"  
    android:gravity="left"   从左边开始剪切

    android:clipOrientation="horizontal"  水平剪切
    android:drawable="@drawable/button5"    被剪切的背景图
     >
</clip>

ClipDrawable类内部预设了一个最大的level值10000 表示截取该图片的全部  如果设置为0 截取该图片的宽度为0  相当于背景图没有设置 这个参数只能在代码中设置

这里在布局文件中 添加一个父容器 设置背景图  在Button上设置剪切

<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" 
        android:background="@drawable/button2" android:layout_marginTop="10dp">
    <Button  android:id="@+id/btn22"  android:layout_width="fill_parent"   android:layout_height="50dp" 
        android:layout_below="@id/myText1" android:background="@drawable/myclipe" />
    </LinearLayout>

如果 代码设置

ClipDrawable cd=(ClipDrawable)(((Button)findViewById(R.id.btn22)).getBackground());
cd.setLevel(10000);//设置为最大值1000 LinearLayout 的背景图被完全覆盖了


如果设置为 

cd.setLevel(5000);

截取 一半的图像显示 左边一半就是clip指定的图像的一半 右边显示LinearLayout一半的图像

7 scale配置

使用scale标签可以对drawable进行缩放操作,和clip一样是通过设置level来控制缩放的比例

android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
android:scaleHeight 设置可缩放的最大高度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半 缩放设置的level超过了这个百分比无法缩放
android:scaleWidth 设置可缩放的最大宽度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半
android:scaleGravity 设置drawable缩放后的位置,取值和bitmap标签的一样,就不一一列举说明了,不过默认值是left
android:useIntrinsicSizeAsMinimum 设置drawable原有尺寸作为最小尺寸,设为true时,缩放基本无效,API Level最低要求为11

举例

drawable添加myscale.xml文件

<scale
    android:drawable="@drawable/button5"
    android:scaleWidth="0%"   --表示水平不能缩放 就算设置了level也无效
    android:scaleHeight="80%"  --表示高度 设置level不能缩放超过80%
    xmlns:android="http://schemas.android.com/apk/res/android">
</scale>

布局文件

<EditText android:id="@+id/myText1"android:background="@drawable/myscale" android:layout_width="fill_parent"
         android:layout_height="50dp"   android:layout_below="@id/myText"/>

在java代码中设置level  level的范围是  【0-10000】

findViewById(R.id.myText1).getBackground().setLevel(8000);

这里 水平 比例  8000/10000 缩放了80% 超过了最大 0%无法缩放 就是拉伸填充原始宽度

        高度  8000/10000 缩放了80%  等于最大值 80% 自动缩放高度到原始高度的80%

   宽度没有缩放  高度黑色的部分缩放了


7 rotate配置

使用rotate标签可以对一个drawable进行旋转操作,在shape篇讲环形时最后举了个进度条时就用到了rotate标签。另外,比如你有一张箭头向上的图片,但你还需要一个箭头向下的图片,这时就可以使用rotate将向上的箭头旋转变成一张箭头向下的drawable。
先看看rotate标签的一些属性吧:


android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
android:fromDegrees 起始的角度度数
android:toDegrees 结束的角度度数,正数表示顺时针,负数表示逆时针
android:pivotX 旋转中心的X坐标,浮点数或是百分比。浮点数表示相对于drawable的左边缘距离单位为px,如5; 百分比表示相对于drawable的左边缘距离按百分比计算,如5%; 另一种百分比表示相对于父容器的左边缘,如5%p; 一般设置为50%表示在drawable中心
android:pivotY 旋转中心的Y坐标
android:visible 设置初始的可见性状态,默认为false
示例代码如下,目标是将一张箭头向上的图片转180度,转成一张箭头向下的图片:


<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_arrow"
    android:fromDegrees="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="180" />

如果使用以上设置没有任何效果不会旋转  如果单纯只是旋转 只需要设置fromDegrees这个参数的角度 就可以旋转指定的角度

android:pivotX 表示旋转角度的x坐标  50%为控件宽度的50%

如果需要android:toDegrees  有效果 必须代码 设置level属性 [0-10000]

如果设置为 5000   旋转的长度 等于  5000/1000  *(180-0)







posted @ 2016-11-18 09:59  饺子吃遍天  阅读(277)  评论(0编辑  收藏  举报