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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wode_dream/article/details/53782126

drawable概述


1drawable是一个抽象类,是对可绘制物件的抽象。与View不同Drawable没有事件和交互方法。

2、Drawable有好多子类操作具体类型资源,比如BitmapDrawable是用来操作位图;ColorDrawable用来操作颜色;ClipDrawable用来操作剪切板。


二、Drawable原理

1、draw(Canvas canvas)

2、setBounds();


文章共将8个drawable

1、BitmapDrawable

扫描二维码关注公众号,回复: 3110165 查看本文章

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;
    }
}



猜你喜欢

转载自blog.csdn.net/wode_dream/article/details/53782126