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

自定义Drawable

2016-09-29 21:19 316 查看
       在Android设计中,Drawable是一个抽象基类,它是所有Drawable对象的基类,每个具体的Drawable都是它的子类。通常没有必要去自定义Drawable,因为自定义Drawable无法再XML中使用,这就降低了自定义Drawable的使用范围。但在某些特殊情况下我们的确想自定义Drawable,这也是可以的。

       通过阅读参考源码是一个比较好的学习方式,我们可以参考ShapeDrawable和BitmapDrawable的源码来了解和学习自定义Drawable的实现过程。参考Drawable源码可以得知,要想自定义Drawable必须继承重写Drawable抽象类中的draw、setAlpha、setColorFilter和getOpacity这几个方法,并且这几个方法是必须要实现的。

       下面给出一个自定义Drawable的例程来演示自定义Drawable过程。

       自定义Drawable

package com.fxj.customdrawabletest.ui;

import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;

public class CustomDrawable extends Drawable {
Paint mPaint;

public CustomDrawable(int color) {
/*创建一个画笔,画笔抗锯齿*/
this.mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(color);
}

@Override
public void draw(Canvas canvas) {
// TODO Auto-generated method stub
final Rect rect=getBounds();
float cx=rect.exactCenterX();
float cy=rect.exactCenterY();
canvas.drawCircle(cx, cy,Math.min(cx, cy), mPaint);
}

/**设置透明度*/
@Override
public void setAlpha(int alpha) {
// TODO Auto-generated method stub
mPaint.setAlpha(alpha);
invalidateSelf();
}

@Override
public void setColorFilter(ColorFilter cf) {
// TODO Auto-generated method stub
mPaint.setColorFilter(cf);
invalidateSelf();
}

@Override
public int getOpacity() {
// TODO Auto-generated method stub
return PixelFormat.TRANSLUCENT;/*使窗口支持透明度*/
}

}

       在上面的代码中draw、setAlpha、setColorFilter和getOpacity这几个方法都是必须要实现的,其中draw方法是最主要的方法,这个方法就和VIew的draw方法类似。                                                                                                       

       MainActivity的代码如下:

package com.fxj.customdrawabletest;

import com.fxj.customdrawabletest.ui.CustomDrawable;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Color;
import android.util.Log;
import android.view.Menu;
import android.view.View;

/**
* 文件名称:自定义Drawable-自定义CustomDrawableTest
* 时间:2016-9-29 20:10
* 说明:1、自定义Drawable需要继承重写android.graphics.drawable.Drawable类中draw、setAlpha、setColorFilter、getOpacity这几个方法,
* 并且这几个方法都是必须重写的。
* 2、当Activity的当前Window获得或失去焦点时会被回调Activity.onWindowFocusChanged方法。
* */

public class MainActivity extends Activity {
private String tag="MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
// TODO Auto-generated method stub
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
View tv2=findViewById(R.id.tv02);
int colorValue=Color.parseColor("#00ff00");
Log.i(tag,"colorValue="+colorValue);
CustomDrawable customDrawable=new CustomDrawable(colorValue);
tv2.setBackgroundDrawable(customDrawable);
}
}
}
         在MainAcitivity代码中重写了Activity.onWindowFocusChanged方法,如果当前Activity的当前Windows获得或失去焦点时,就会回调Activity.onWindowFocusChanged方法。

  例程代码(github)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息