您的位置:首页 > 移动开发 > Android开发

Android中的各种Drawable讲解(慕课笔记)

2016-12-21 11:20 351 查看
drawable概述

1、drawable是一个抽象类,是对可绘制物件的抽象。与View不同Drawable没有事件和交互方法。
2、Drawable有好多子类操作具体类型资源,比如BitmapDrawable是用来操作位图;ColorDrawable用来操作颜色;ClipDrawable用来操作剪切板。

二、Drawable原理
1、draw(Canvas canvas)
2、setBounds();

文章共将8个drawable
1、BitmapDrawable
BitmapDrawable是对bitmap的一种包装,可以设置它包装的bitmap在BitmapDrawable区域内的绘制方式,如平铺填充、拉伸填充或者保持图片原始大小。
例1、
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_launche"
android:tileMode="mirror"
android:gravity="center"
android:antialias="true"
android:dither="true"/>
<!--
android:antialias=“true” //抗锯齿
android:dither=“true” //允许抖动
-->

2、LayerDrawable

管理一组drawable对象在LayerDrawable的drawable资源按照列表的顺序绘制,列表的最后一个drawable绘制在最上层
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:top="20dip"
android:left="20dip">
<bitmap
android:src="@drawable/pic1"
android:gravity="center"/>
</item>
<item
android:top="20dip"
android:left="20dip">
<bitmap
android:src="@drawable/pic2"
android:gravity="center"/>
</item>
</layer-list>

3、StateListDrawable

就是一个在xml文件中定义,StateListDrawable可以根据不同的状态提供不同的背景。
比如,一个按钮有多种状态,获取焦点,失去焦点,点击。
<?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/botton_add"/>
<item android:state_pressed="true" android:drawable="@drawable/botton_add_down"/>
<item android:state_selected="true" android:drawable="@drawable/botton_add"/>
<item android:drawable="@drawable/botton_add"/>
</selector>

4、LevelListDrawable

1.  LeveListDrawable管理一组drawable资源
LeveListDrawable里面的每一个drawable资源与一个最大数值结合起来,作为LevelListDrawable资源的一项

2.  调用Drawable的setLevel()方法可以加载level-list或代码定义的某个drawable资源
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:src="@drawable/lamp_off"
android:minLevel="6"
android:maxLevel="10">
</item>
<item
android:src="@drawable/lamp_on"
android:minLevel="12"
android:maxLevel="20">
</item>
</level-list>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开灯"
android:onClick="lampOn"
android:id="@+id/lampOn"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关灯"
android:onClick="lampOff"
android:id="@+id/lampOff"/

ImageView iv=(ImageView)findViewById(R.id.iv);
iv.setImageLevel(8);//关灯
iv.setImageLevel(15);//

5、TransitionDrawable

TransitionDrawable是LayerDrawable的子类,不过它只负责管理两层drawable,并且提供了一个透明度变化的动画,可以控制从一层drawble过渡到另外一层drawable的动画效果。
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:src="@drawable/lamp_off">
</item>
<item
android:src="@drawable/lamp_on">
</item>
</transition>

开灯
TransitionDrawable drawable=(TransitionDrawable)findViewById(R.id.transition);
drawable.startTransition(3000);

关灯
TransitionDrawable drawable=(TransitionDrawable)findViewById(R.id.transition);
drawable.reverseTransition(3000);

6、InsertDrawable

InsetDrawable表示一个drawable嵌入到另外一个drawable内部,并且在内部留一些间距,这一点很像drawable的padding属性

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/background"
android:insetLeft="50dip"
android:insetRight="50dip"
android:insetTop="50dip"
android:insetBottom="50dip">
</inset>

7、ClipDrawable

1、ClipDrawable是对Drawable进行剪切操作,控制剪切区域;
2、android中的进度条就是使用一个ClipDrawable实现效果的,它根据level的属性值,决定剪切区域的大小
3、ClipDrawable通过setLevel(int level)方法来设置剪切区域;level从0到10000,为0时完全不显示,为10000时完全显示
<?xml version="1.0" encoding="utf-8"?>
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/androidRobot"
android:clipOrientation="horizontal"
android:gravity="left">
</clip>

<ImageView
android:src=“@drawable/clip”/>
ImageView iv=(ImageView)findViewById(R.id.image);
ClipDrawable drawable=(ClipDrawable)iv.getDrawable();
drawable.setLevel(5000);   //露出左半部分


8、自定义drawable

Drawable是一个抽象类,是对可绘制物件的抽象。与View不同Drawable没有事件和交互方法;
Drawable有好多子类操作具体类型资源,比如
BitmapDrawable是用来操作位图
ColorDrawable是用来操作颜色
ClipDrawable是来操作剪切板
举个栗子:
/**
* Created by zhaofeng on 2016/12/21.
*
* @howtoUse
*
* 1、在layout中写一个普通的<ImageView/>
* 2、ImageView iv=(ImageView)findViewById(R.id.image);
* Bimap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
* iv.setImageDrawable(new CircleDrawable(bitmap));
*/

public class CircleDrawable extends Drawable
{
private int mWidth;
private Paint mPaint;
private Bitmap mBitmap;

public CircleDrawable(Bitmap bitmap){
this.mBitmap=bitmap;
BitmapShader bitmapShader=new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint=new Paint();
mPaint.setAntiAlias(true);
mPaint.setShader(bitmapShader);
mWidth=Math.min(mBitmap.getWidth(),mBitmap.getHeight());
}
@Override
public void draw(Canvas canvas) {
canvas.drawCircle(mWidth/2,mWidth/2,mWidth/2,mPaint);
}

@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}

@Override
public void setColorFilter(ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
}

@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;//获得系统的透明度
}

@Override
public int getIntrinsicHeight() {
return mWidth;
}

@Override
public int getIntrinsicWidth() {
return mWidth;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: