来来来,看看 Android Drawable 的那些事儿


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下边框 android:drawableBottom=”@drawable/selector_edittext_line”

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


可能以上整理的不太全面,啊哈哈哈,可能还有错误的存在,欢迎指教。(ꈍᴗꈍ)

更多相关文章

  1. Android(安卓)-- Wifi启动流程分析
  2. Android(安卓)Activity生命周期--应知应会
  3. Android(安卓)飞行模式的设置(打开/关闭飞行模式,获取飞行状态状
  4. Bluetooth in Android(安卓)4.2 and 4.3(三):Enable Bluetooth
  5. android fragment 使用name关联Fragment
  6. Android(安卓)工程在4.0基础上混淆
  7. Android仿人人客户端(v5.7.1)——网络模块时序图
  8. Android(安卓)动画框架(一)转
  9. Android(安卓)软键盘的监听(监听高度,是否显示)

随机推荐

  1. ISIS路由泄露,如何避免路由环路?
  2. 如何批量Ping N个IP地址,掌握一个命令让你
  3. H3C交换机命名规则
  4. 网工必知:用于监控企业网络的10款最佳工具
  5. 如何制作毛玻璃效果?
  6. DOS***、DDOS***不懂?看完让你秒懂!
  7. 1分钟手把手教你破解华为交换机密码
  8. 《网工必备技术命令大全》
  9. Microsoft Edge浏览器的Universal XSS漏
  10. 投资ipfs要多少钱?ipfs靠谱吗?