Drawable-详解

参考资料


目录

    1. 简介
    1. Drawable分类
    • 2.1) BitmapDrawable
    • 2.2) ShapeDrawable
    • 2.3) LayerDrawable
    • 2.4) StateListDrawable
    • 2.5) LevelListDrawable
    • 2.6) TransitionDrawable
    • 2.7) InsertDrawable
    • 2.8) ScaleDrawable
    • 2.9) ClipDrawable
    1. 自定义Drawable

1)简介

  • Drawable图像(可以在Canvas上进行绘制的抽象概念)。常见的颜色和图片都可以是一个Drawable。
    Drawable使用范围单一,一个是作为ImageView中图像显示,另一个就是作为View的背景。
  • Drawable是抽象类,是所有Drawable的基类
  • getIntrinsicWidth() 和 getIntrinsicHeight()可以获得Drawable的内部宽高,但不是所有Drawable都有此属性(图片有,颜色就没有。可用来Drawable转Bitmap),且此宽高不等同于它的大小,一般Drawable没有大小概念,当用作View的背景时,Drawable会被拉伸至View的大小

2)Drawable分类

2.1)BitmapDrawable

就是一张图片,也可以通过xml的方式描述

<?xml version="1.0" encoding="utf-8"?>
<bitmap
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:src="@drawable/xxx"
  android:antialias=["true"|"false"]  //抗锯齿,应开启
  android:dither=["true"|"false"]  //是否开启抖动,可让高质量图片在低质量设备上保持较好显示效果,应开启
  android:filter=["true"|"false"]  //是否开启过滤,应开启
  android:gravity=["top"|"bottom"|"left"|"right"|"center_vertcial"|"fill_vertical"|"center_horizontal"|"fill_horizontal"|"center"|"fill"|"clip_vertical"|"clip_horizontal"]
  android:minMap=["true"|"false"]  //默认false,不常用
  android:tileMode=["disabled"|"clamp"|"repeat"|"mirror"] //disable默认,其他三种情况会忽略gravity属性。repeat重复平铺,mirror镜面投影,clamp图片四周的像素会扩展至周围区域
  />

2.2)ShapeDrawable

新建文件~res/drawable/shape_test.xml

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    //默认为rectangle矩形,oval椭圆,line横线,ring圆环
    android:shape=["rectangle"|"oval"|"line"|"ring"]>
   <corners   //当shape="rectangle"时使用
      //半径,会被后面的单个半径属性覆盖,默认为1dp
      android:radius="integer"
      android:topLeftRadius="integer"
      android:topRightRadius="integer"
      android:bottomLeftRadius="integer"
      android:bottomRightRadius="integer"/>
   <gradient  
      android:type=["linear" | "radial" | "sweep"]    //共有3中渐变类型,线性渐变(默认)/放射渐变/扫描式渐变   
      android:angle="integer"     //渐变角度,必须为45的倍数,0为从左到右,90为从上到下   
      android:centerX="float"     //渐变中心X的相当位置,范围为0~1   
      android:centerY="float"     //渐变中心Y的相当位置,范围为0~1   
      android:startColor="color"   //渐变开始点的颜色   
      android:centerColor="color"  //渐变中间点的颜色,在开始与结束点之间   
      android:endColor="color"    //渐变结束点的颜色   
      android:gradientRadius="float"  //渐变的半径,只有当渐变类型为radial时才能使用   
      android:useLevel=["true" | "false"] />  //使用LevelListDrawable时就要设置为true。设为false时才有渐变效果  
      />
  <solid    //填充颜色,与gradient互相排斥
      android:color="color"/>
  <stroke        //描边属性
      android:width="dimension"   //描边的宽度   
      android:color="color"   //描边的颜色   
      // 以下两个属性设置虚线   
      android:dashWidth="dimension"   //虚线的宽度,值为0时是实线   
      android:dashGap="dimension" />      //虚线的间隔  

//下面2个一般不怎么用,因为他们的功能控件本身也有
   <padding    
      android:left="integer"   
      android:top="integer"   
      android:right="integer"   
      android:bottom="integer" /> 
   <size   //指定大小 一般在imageview配合scaleType
      android:width="integer"   
      android:height="integer" /> 
</shape>

2.2)LayerDrawable

屏幕快照 2017-07-24 下午4.56.59.png

新建文件~res/drawable/layer_test.xml

<?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>

2.4)StateListDrawable

对应于<selector>标签,常用于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:state_press=["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_enable=["true"|"false"]
      android:state_activated=["true"|"false"]
      android:state_window_focused=["true"|"false"]
      android:drawable="@android:color/holo_green_dark" //默认需要放最后
      />
</selector>

2.5)LevelListDrawable

为了让ImageView根据条件显示不同的图片,常常会使用if判断。但有更简单的方法: <level-list>标签。Android的手机显示剩余电量就是用这个方法来显示不同图片的。
LevelListDrawable的level区间为 0~10000

<ImageView
        android:id="@+id/level_view"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        android:src="@drawable/level_test"/>

ImageView level_view = (ImageView)findViewById(R.id.level_view);
level_view.getDrawable().setLevel(11);
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@android:color/holo_green_dark"
        android:maxLevel="10"
        android:minLevel="0"/>
    <item
        android:drawable="@android:color/holo_red_dark"
        android:maxLevel="20"
        android:minLevel="11"/>
</level-list>

2.6)TransitionDrawable

<transition>标签,实现两个Drawable之间的淡入淡出动画效果


TransitionDrawable.gif
 <TextView
        android:id="@+id/transition_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello"
        android:background="@drawable/transition_test"/>

TextView transition_view = (TextView) findViewById(R.id.transition_view);
TransitionDrawable drawable = (TransitionDrawable) transition_view.getBackground();
drawable.startTransition(2000);
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/holo_green_dark"/>
    <item android:drawable="@android:color/holo_orange_dark"/>
</transition>

2.7)InsertDrawable

对应<insert>标签,可以将其他Drawable内嵌到自己中,并可以四周留出一定间距。使用LayerDrawable可以实现相同效果。


2.8)ScaleDrawable

对应<scale>标签,可以根据自己的等级(level)将指定的Drawable缩放到一定比例
ScaleDrawable的level区间为 0~10000。0是不可见的。


ScaleDrawable.png
<View
        android:id="@+id/scale_view"
        android:layout_width="match_parent"
        android:layout_height="20dp"
        android:background="@drawable/scale_test"/>

View scale_view = findViewById(R.id.scale_view);
ScaleDrawable drawable2 = (ScaleDrawable) scale_view.getBackground();
drawable2.setLevel(1);
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@android:color/holo_blue_light"
    android:scaleWidth="50%"
    android:scaleHeight="50%"
    android:scaleGravity="center">
</scale>

2.9)ClipDrawable

对应<clip>标签,可以根据level来裁剪一个Drawable。
ClipDrawable的level区间为0~10000。 0表示完全裁剪,整个Drawable不可见了。10000表示不裁剪。


ClipDrawable.png
<ImageView
        android:id="@+id/clip_view"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/clip_test"/>

ImageView clip_view = (ImageView) findViewById(R.id.clip_view);
ClipDrawable drawable1 = (ClipDrawable) clip_view.getDrawable();
drawable1.setLevel(8000);
<clip
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:clipOrientation="vertical"
    android:drawable="@android:color/holo_red_light"
    android:gravity="bottom">

上述代码设置android:gravity="bottom"表示从顶部开始裁剪。level为8000表示裁剪了2000,即在顶部裁剪了20%的区域


3)自定义Drawable

注意:自定义Drawable无法在XML中引用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • 1、Drawable 简介 Drawable——可简单理解为可绘制物,表示一些可以绘制在 Canvas 上的对象。...
    牧秦丶阅读 14,755评论 0 15
  • 不怕跌倒,所以飞翔 关于Drawable的一些说明类的文字我就不写了,但是Drawable其实挺重要的,一些问题都...
    笔墨Android阅读 667评论 0 2
  • 转载自Keegan小钢并标明原文链接:http://keeganlee.me/post/android/20150...
    坚持编程_lyz阅读 1,123评论 0 1
  • 概述 今天我们来探究一下android的样式。其实,几乎所有的控件都可以使用 background属性去引用自定义...
    CokeNello阅读 4,822评论 1 19
  • 经历不少 多少带些老青春岁月的欢快 无知的不知所措 人能被治愈的是医院 心能被治愈的是自己 梦一场病一场,负了13...
    321小肥仔阅读 295评论 0 0