• Android的Drawable


    Drawable简介 

     1.Drawable的优点

    • 它使用简单,比自定义View的成本要低;
    • 其次,非图片类型的Drawable占用空间较小,这对减小apk的大小也很有帮助。

     2.Drawable是没有大小概念的,当用作View的背景时,Drawable会被拉伸至View的同等大小 

    常用Drawable

    1.BitmapDrawable
      最简单的Drawable了,它表示的就是一张图片。在实际开发中,我们可以直接引用原始的图片即可,但是也可以通过XML的方式来描述它,通过XML来描述的BitmapDrawable可以设置更多的效果

    <?xml version="1.0" encoding="utf-8"?>
    <bitmap
    		xmlns:android="http://schemas.android.com/apk/res/android"
    		android:src="@[package:]drawable/drawable_resource"
    		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"]
    />
    

    属性说明:
      antialias
        是否开启图片抗锯齿功能。开启后会让图片变得平滑,同时也会在一定程度上降低图片的清晰度,但是这个降低的幅度较低以至于可以忽略,因此抗锯齿选项应该开启
      dither
        是否开启抖动效果,应该开启
      filter
        是否开启过滤效果。当图片尺寸被拉伸或者压缩时,开启过滤效果可以保持较好的显示效果,因此此选项也应该开启。
      gravity
        当图片小于容器的尺寸时,设置此选项可以对图片进行定位。这个属性的可选项比较多,不同的选项可以通过“|”来组合使用
      mipMap
        这是一种图像相关的处理技术,也叫纹理映射,比较抽象,这里也不对其深究了,默认值为false,
      tileMode
        平铺模式
         disable表示关闭平铺模式,这也是默认值,当开启平铺模式后,gravity属性会被忽略
         repeat、mirror和clamp的区别,这三者都表示平铺模式,但是它们的表现却有很大不同。
         repeat表示的是简单的水平和竖直方向上的平铺效果;
         mirror表示一种在水平和竖直方向上的镜面投影效果;
         clamp表示的效果就更加奇特,图片四周的像素会扩展到周围区域 

    2.ShapeDrawabl

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

    属性说明

      corners 

        表示shape的四个角的角度。它只适用于矩形shape,这里的角度是指圆角的程度,用px来表示shape的四个角的角度。
         android:radius——为四个角同时设定相同的角度,优先级较低,会被其他四个属性覆盖;
         android:topLeftRadius——设定最上角的角度;
         android:topRightRadius——设定右上角的角度;
         android:bottomLeftRadius——设定最下角的角度;
         android:bottomRightRadius——设定右下角的角度。
      gradient
        它与<solid>标签是互相排斥的,其中solid表示纯色填充,而gradient则表示渐变效果,gradient有如下几个属性:
         android:angle——渐变的角度,默认为0,其值必须为45的倍数,0表示从左到右,90表示从下到上,具体的效果需要自行体验,总之角度会影响渐变的方向;
         android:centerX——渐变的中心点的横坐标;
         android:centerY——渐变的中心点的纵坐标,渐变的中心点会影响渐变的具体效果;
         android:startColor——渐变的起始色;
         android:centerColor——渐变的中间色;
         android:endColo——渐变的结束色;
         android:gradientRadius——渐变半径,仅当android:type= "radial"时有效;
         android:useLevel——一般为false,当Drawable作为StateListDrawable使用时为true;
         android:type——渐变的类别,有linear(线性渐变)、radial(径向渐变)、
         sweep(扫描线渐变)三种,其中默认值为线性渐变,
      solid
        这个标签表示纯色填充,通过android:color即可指定shape中填充的颜色
      stroke
         android:width——描边的宽度,越大则shape的边缘线就会看起来越粗;
         android:color——描边的颜色;
         android:dashWidth——组成虚线的线段的宽度;
         android:dashGap——组成虚线的线段之间的间隔,间隔越大则虚线看起来空隙就越大。
      注意如果android:dashWidth和android:dashGap有任何一个为0,那么虚线效果将不能生效
      padding
        这个表示空白,但是它表示的不是shape的空白,而是包含它的View的空白,有四个属性:android:left、android:top、android:right和android:bottom。
      size
         <size>标签设置的宽/高就是ShapeDrawable的固有宽/高,但是作为View的背景时,shape还会被拉伸或者缩小为View的大小。


    3.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:drawable="@[package:]drawable/drawable_resource"
    		android:id="@[+][package:]id/resource_name"
    		android:top="dimension"
    		android:right="dimension"
    		android:bottom="dimension"
    		android:left="dimension" />
    </layer-list>
    

       Layer-list有层次的概念,下面的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="6dp">
        <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>
    

     4.StateListDrawable

    StateListDrawable对应于<selector>标签,它也是表示Drawable集合,每个Drawable都对应着View的一种状态,这样系统就会根据View的状态来选择合适的Drawable。StateListDrawable主要用于设置可单击的View的背景,最常见的是Button。点击Button的背景变色。

    <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="@[package:]drawable/drawable_resource"
    	android:state_pressed=["true" | "false"]
    	android:state_focused=["true" | "false"]
    	android:state_hovered=["true" | "false"]
    	android:state_selected=["true" | "false"]
    	android:state_checkable=["true" | "false"]
    	android:state_checked=["true" | "false"]
    	android:state_enabled=["true" | "false"]
    	android:state_activated=["true" | "false"]
    	android:state_window_focused=["true" | "false"] />
    </selector>
    

     属性说明:

      android:constantSize  此选项默认值为false。
      dither 是否开启抖动效果
      variablePadding :
         StateListDrawable的padding表示是否随着其状态的改变而改变,true表示会随着状态的改变而改变,false表示StateListDrawable的padding是内部所有Drawable的padding的最大值。此选                项默认值为false,并且不建议开启此选项。
     Button的例子:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    	<item android:state_pressed="true"
    	    android:drawable="@drawable/button_pressed" /> <!--pressed -->
    	<item android:state_focused="true"
    	     android:drawable="@drawable/button_focused" /> <!--focused -->
    	<item android:drawable="@drawable/button_normal" /> <!--default -->
    </selector>
    

     
    本文内容为《Android开发艺术探索》内容,电子版下载地址

    天助自助者
  • 相关阅读:
    Mina入门demo
    MySQL数据库插入中文时出现Incorrect string value: 'xE6x97xB7xE5x85xA8' for column 'sz_name' at row 1
    synchronized和volatile
    springboot+Zookeeper+Dubbo入门
    zookeeper的安装
    windows下dubbo-admin的安装
    Java 枚举类
    Mysql 解压版 安装时候的注意事项
    Java——JDBC鶸笔记
    《初识Java微信公众号开发》 学习中遇到的困难
  • 原文地址:https://www.cnblogs.com/ZeGod/p/10195861.html
Copyright © 2020-2023  润新知