Android UI绘制 -- Drawable

时间:2024-05-22 15:24:29

Drawable 功能

获取和设定可绘制区域
public final Rect getBounds()
 public void setBounds(int left, int top, int right, int bottom)
 public void setBounds(Rect bounds)
 //显示级别,从0到10000
public final boolean setLevel(int level)
public final int getLevel()
public void onLevelChange()
//视图状态
//常见状态有:state_window_focused state_pressed  state_selected state_focused state_enabled
public boolean setState(final int[] stateSet)
public int[] getState()
//滤镜效果,其中PorterDuffColorFilter提供各种融合的模式算法
public void setColorFilter(int color, PorterDuff.Mode mode) {
 public abstract void setColorFilter(ColorFilter cf);
 public void clearColorFilter()  //清除颜色过滤器。

Android UI绘制 -- Drawable

ColorDrawable

颜色

BitmapDrawable

位图

//画布上的密度比值
 public void setTargetDensity(Canvas canvas)
//当前屏幕的密度比值
public void setTargetDensity(DisplayMetrics metrics)
//指定密度比值,注意这里的密度是DisplayMetrics中的DENSITY_XXX。
public void setTargetDensity(int density)

//平铺方式
public final void setTileModeY(Shader.TileMode mode)
public void setTileModeX(Shader.TileMode mode)

//设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。  
void setAntiAlias(boolean aa);  
    
//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰  
void setDither(boolean dither);  
     
// 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于dither和xfermode的设置  
 void setFilterBitmap(boolean filter);  
   
//设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果 
void setColorFilter(ColorFilter colorfilter);

ClipDrawable

裁剪

AnimationDrawable

帧动画

public void addFrame(Drawable frame, int duration)  //添加要播放的Drawable帧以及播放时长。
public int getDuration(int i)   //每帧时长
public Drawable getFrame(int index) //获取帧
public int getNumberOfFrames()   //得到总帧数
public void setOneShot(boolean oneShot)  //单次还是循环

InsetDrawable

实现容器内Drawable四个方向缩进或者某个方向的缩进。如果为负数则是外缩进

ScaleDrawable

缩放

RotateDrawable

旋转

ShapeDrawable

形状

常见的Shape有:
ArcShape 弧形
OvalShape 椭圆形
PathShape 路径,相当于自定义图形
RectShape 矩形
RoundRectShape 圆角矩形

PaintDrawable ,ShapeDrawable的派生类。圆角矩形RoundRectShape的简化版本,只会设置外圆角,只需要设置一个或者8个即可

LayerDrawable

图层

TransitionDrawable

淡入淡出效果

LevelListDrawable

等级显示

StateListDrawable

不同状态下显示不同Drawable

NinePatchDrawable

.9格式

GradientDrawable

渐变

PictureDrawable

图片

视图状态

状态设置说明

android:state_enabled                **设置触摸或点击事件是否可用状态**,一般只在false时设置该属性,表示不可用状态
android:state_pressed                **设置是否按压状态**,一般在true时设置该属性,表示已按压状态,默认为false
android:state_selected               **设置是否选中状态**,true表示已选中,false表示未选中
android:state_checked:               **设置是否勾选状态**,主要用于CheckBox和RadioButton,true表示已被勾选,false表示未被勾选
android:state_checkable              **设置勾选是否可用状态**,类似state_enabled,只是state_enabled会影响触摸或点击事件,state_checkable影响勾选事件
android:state_focused                **设置是否获得焦点状态**,true表示获得焦点,默认为false,表示未获得焦点
android:state_window_focused         **设置当前窗口是否获得焦点状态**,true表示获得焦点,false表示未获得焦点,例如拉下通知栏或弹出对话框时, 当前界面就会失去焦点;另外,ListView的ListItem获得焦点时也会触发true状态,可以理解为当前窗口就是ListItem本身
android:state_activated              **设置是否被**状态**,true表示被**,false表示未**,API Level 11及以上才支持,可通过代码调用控件的setActivated(boolean)方法设置是否**该控件
android:state_hovered                **设置是否鼠标在上面滑动的状态**,true表示鼠标在上面滑动,默认为false,API Level 14及以上才支持
补充:selector标签下有两个比较有用的属性要说一下,添加了下面两个属性之后,则会在状态改变时出现淡入淡出效果,
但必须在API Level 11及以上才支持
android:exitFadeDuration             **状态改变时,旧状态消失时的淡出时间,以毫秒为单位**
android:enterFadeDuration            **状态改变时,新状态展示时的淡入时间,以毫秒为单位**

focused:一个窗口只能一个View处于focused,一般由按键操作引起
selected:允许同时多个处于selected状态,一般由程序主动调用
pressed:一般由触摸消息引起

背景设置实例

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 当前窗口失去焦点时 -->
<item android:drawable="@drawable/bg_btn_lost_window_focused" android:state_window_focused="false" />
<!-- 不可用时 -->
<item android:drawable="@drawable/bg_btn_disable" android:state_enabled="false" />
<!-- 按压时 -->
<item android:drawable="@drawable/bg_btn_pressed" android:state_pressed="true" />
<!-- 被选中时 -->
<item android:drawable="@drawable/bg_btn_selected" android:state_selected="true" />
<!-- 被**时 -->
<item android:drawable="@drawable/bg_btn_activated" android:state_activated="true" />
<!-- 默认时 -->
<item android:drawable="@drawable/bg_btn_normal" />
</selector>

颜色设置实例

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 当前窗口失去焦点时 -->
<item android:color="@android:color/black" android:state_window_focused="false" />
<!-- 不可用时 -->
<item android:color="@android:color/background_light" android:state_enabled="false" />
<!-- 按压时 -->
<item android:color="@android:color/holo_blue_light" android:state_pressed="true" />
<!-- 被选中时 -->
<item android:color="@android:color/holo_green_dark" android:state_selected="true" />
<!-- 被**时 -->
<item android:color="@android:color/holo_green_light" android:state_activated="true" />
<!-- 默认时 -->
<item android:color="@android:color/white" />
</selector>

Android中的Drawable基础与自定义Drawable

Android中Drawable整体介绍