在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);}@Overridepublic void draw(Canvas canvas) {// TODO Auto-generated method stubfinal Rect rect=getBounds();float cx=rect.exactCenterX();float cy=rect.exactCenterY();canvas.drawCircle(cx, cy,Math.min(cx, cy), mPaint);}/**设置透明度*/@Overridepublic void setAlpha(int alpha) {// TODO Auto-generated method stubmPaint.setAlpha(alpha);invalidateSelf();}@Overridepublic void setColorFilter(ColorFilter cf) {// TODO Auto-generated method stubmPaint.setColorFilter(cf);invalidateSelf();}@Overridepublic int getOpacity() {// TODO Auto-generated method stubreturn 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";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic void onWindowFocusChanged(boolean hasFocus) {// TODO Auto-generated method stubsuper.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)


更多相关文章

  1. Android:基于Eclipse编译调试系统级应用源代码
  2. Android事件处理--读书笔记
  3. [Unity通信]快速接入sdk
  4. Android(安卓)DiskLruCache完全解析,硬盘缓存的最佳方案
  5. Android自定义背景的设置方法
  6. android 注解简介三: 自定义注解实现视图绑定
  7. Android(安卓)Wi-Fi子系统学习笔记
  8. Android(安卓)studio和码云步骤
  9. 详解Android(安卓)ActionBar之一:ActionBar概述与创建

随机推荐

  1. adnroid开发环境的搭建
  2. android MediaScanner详解-扫描得到多媒
  3. Android(安卓)Studio无法运行模拟器或者
  4. android的位置服务和地图
  5. Android(安卓)5.0新特性之Material Desig
  6. Android(安卓)调用系统相机拍照并获取图
  7. SharedPreferences 简介
  8. Android(安卓)ramdisk.img system.img us
  9. 使用 Annotation 改善 Android(安卓)代码
  10. Android(安卓)UI Libs之CircleImageView