Drawable和View区别 ε-(´∀`; )
Drawable是一个抽象类,是对可绘制物件的抽象。
与View不同,Drawable没有时间和交互的方法,而View直接面向用户,可以为其添加事件。
Drawable有很多子类操作类型资源,如下
- BitmapDrawable
- LayerDrawable
- StateListDrawable
- ClipDrawable
- LevelListDrawable
- TransitionDrawable
- InsertDrawable
- ClipDrawable
- ShapeDrawable
- ……
╭( ′• o •′ )╭☞ Drawable原理
draw(Canvas canvas)在其中通过画布进行绘制;
setBounds()指定绘制的边界,通常传入一个矩形的绘制对象对其进行绘制。
1.BitmapDrawable
BitmapDrawable是对bitmap的一种包装,可以设置它所包装的bitmap在BitmapDrawable区域内的绘制方式
包括:平铺、拉伸或者保持原始大小等等
android:tileMode="mirror" 模式
mirror:镜像
repeat:重复
disable:平铺
clamp:图片四周的像素扩散到周围区域android:antialias="true" 抗锯齿
android:dither="true" 抖动
android:filter="true" 过滤(图片拉伸或压缩建议开启过滤)
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_avatar"
android:tileMode="mirror"
android:antialias="true"
android:dither="true"
android:filter="true">
</bitmap>
2.LayerDrawable
LayerDrawable管理一组drawable对象在LayerDrawable的绘制顺序,列表最后一个drawable在最上层
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:left="20dp"
android:top="20dp">
<bitmap
android:gravity="center"
android:src="@drawable/ic_avatar1"
</item>
<item
android:left="20dp"
android:top="20dp">
<bitmap
android:gravity="center"
android:src="@drawable/ic_avatar2"
</item>
</layer-list>
3.StateListDrawable
根据不同、状态提供不同的背景。比如按钮获取失去焦点,点击等。
状态 | 含义 |
---|---|
android:state_pressed | 按下的状态,(按下但是还没松开) |
android:state_focused | 当前View获取了焦点 |
android:state_selected | 用户选择了当前View |
android:state_checked | 用户选中了View,一般用于CheckBox这种非黑即白的选项 |
android:state_enabled | 当前View处于可用的状态 |
android:state_hovered | 光标是否悬停,通常与focused state相同,它是4.0的新特性 |
android:state_checkable | 组件是否能被check。如:RadioButton是可以被check的。 |
android:state_activated | 是否被激活 |
android:state_window_focused | 应用程序是否在前台,当有通知栏被拉下来或者一个对话框弹出的时候应用程序就不在前台了 |
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/ic_down"></item>
<item android:state_pressed="true" android:drawable="@drawable/ic_select"></item>
<item android:state_selected="true" android:drawable="@drawable/ic_select"></item>
<item android:drawable="@drawable/ic"></item>
</selector>
( ´◔‸◔`) 为毛一定要在最后加一个默认的状态?
每个item对应一个具体drawable,系统从上到下进行查找,直到匹配;所以,如果没找到就选择默认的,啊哈哈,留一手。
EditText下边框
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape android:shape="rectangle">
<corners android:radius="5dp" />
<solid android:color="@color/deeppink" />
</shape>
</item>
<item >
<shape android:shape="rectangle">
<corners android:radius="5dp" />
<solid android:color="@color/pink" />
</shape>
</item>
</selector>
4.LevelListDrawable
管理一组drawable资源,通过调用setLevel()方法加载listvel-list或代码中定义的某个drawable资源,范围0-10000,够用不?
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/ic_on"
android:maxLevel="10"
android:minLevel="6">
</item>
<item
android:drawable="@drawable/ic_off"
android:maxLevel="20"
android:minLevel="12">
</item>
</level-list>
在代码中设置imageView.setImageLevel(8);
5.TransitionDrawable
为LayerDrawable子类,只管理两层,提供透明度变化,可以控制从一层过度到另一层的动画效果
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_on"></item>
<item android:drawable="@drawable/ic_off"></item>
</transition>
在代码中
TransitionDrawable drawable = (TransitionDrawable)v.getDrawable();
drawable.startTransition(3000);
// ↓ 变身
TransitionDrawable drawable = (TransitionDrawable)v.getDrawable();
drawable.reverseTransition(3000); // /渐变时间3s
6.InsertDrawable
嵌入到另一个drawable,可以设置inset内边距
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_avatar"
android:inset="50dp">
</inset>
7.ClipDrawable
对drawable进行剪切,通过setLevel进行剪切,level从0-10000
裁剪方式android:clipOrientation="horizontal"
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="horizontal"
android:drawable="@drawable/ic_avatar"
android:gravity="left">
</clip>
横向显示图片的一半(5000)
ClipDrawable drawable = (ClipDrawable)v.getDrawable();
drawable.setLevel(5000);
8.ShapeDrawable
android:shape="oval" | 图片形状 | rectangle(默认)、oval(椭圆)、line、ring |
android:angle | 渐变的角度 | 默认为0,值为45的倍数,0表示从左往右,90表示从下到上 |
corners | 圆角角度 | 适用于矩形 |
solid | 纯色填充 | |
gradient | 渐变效果 | 与solid相排斥 |
stroke | 描边 | android:width 宽度、android:color 颜色 、android:dashWidth 虚线线段宽度、android:dashGap 注册虚线之间的间距 |
size | shape大小 | size指定宽高后,ShapeDrawable就有固定宽/高 |
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<corners
android:bottomLeftRadius="10dp"
android:bottomRightRadius="10dp"
android:radius="5dp"
android:topLeftRadius="10dp"
android:topRightRadius="10dp"/>
<gradient
android:angle="0"
android:centerColor="#cccccc"
android:centerX="100"
android:centerY="20"
android:endColor="#abcdef"
android:gradientRadius="100dp"
android:startColor="#000000"
android:type="linear"
android:useLevel="false"/>
<solid android:color="#cccccc"/>
<stroke
android:width="1dp"
android:color="#cccccc"
android:dashGap="2dp"
android:dashWidth="50dp"/>
</shape>
eg:文字加入边框
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ffffff"/>
<corners android:radius="5dip"/>
</shape>