今天开始学习了Android中的动态图形的绘制,直接用个例子上手;


    基本思路如下:

    一:创建一个继承与View类自定义类,本例是(CanvasView),必须要有构造方法(可以使用1: public View(Context context);2: public View(Context context, AttributeSet attrs);3:public View(Context context, AttributeSet attrs, int defStyle)的其中一个);

    二:覆盖其中的onDraw()方法;使用其中Canvas对象在界面上面绘制图形;

    三;然后我们可以通过postInvalidate()或者invalidate()方法来调用onDraw()方法来进行图形的重绘.


【注:invalidate ()和postInvalidate()方法的选择:文档中已经写的很清楚了,如果要使用invalidate()必须要在UI主线程当中,如果不在UI主线程中,就要去调用postInValidate()】

        

      下面是我写的一个例子:使用了两种更新的方法1:Handler结合invalidate();2:直接使用postInvalidate()

实现的效果是:在屏幕上面画一个矩形,然后开个线程,让矩形每隔一秒改变颜色,并且矩形以x轴和y轴分别同时加+1想右下角移动. 

       看下效果图:

     

      

     第一种方法代码如下:【直接使用postInvalidate()】

package com.jiangqq.csdn;  /**  * 自定义组件画组件  */ import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.MotionEvent; import android.view.View;  public class CanvasView extends View {  	public int x = 0; 	public int y = 0; 	public int mIndex = 0; //必须加入构造函数,也可以使用另外两个构造函数 	public CanvasView(Context context) { 		super(context); 		//下面两个设置聚焦和触摸模式,可以不设置,这里设置了,因为其他地方要加入这两个事件 		setFocusable(true); 		setFocusableInTouchMode(true); 	}  	@Override 	public boolean onTouchEvent(MotionEvent event) { 		return false; 	}  	@Override 	protected void onDraw(Canvas canvas) { 		super.onDraw(canvas); 		if (mIndex < 100) { 			mIndex++; 		} else { 			mIndex = 0; 		} 		Paint _Paint = new Paint(); 		switch (mIndex % 4) { 		case 0: 			_Paint.setColor(Color.RED); 			break; 		case 1: 			_Paint.setColor(Color.BLUE); 			break; 		case 2: 			_Paint.setColor(Color.YELLOW); 			break;  		case 3: 			_Paint.setColor(Color.LTGRAY); 			break; 		} 		canvas.drawRect(x, y, x + 100, y + 100, _Paint); 	}  } 
   主Activity类如下:
	private CanvasView _CanvasView; 	@Override 	public void onCreate(Bundle savedInstanceState) { 		super.onCreate(savedInstanceState); 		_CanvasView = new CanvasView(this); 		setContentView(_CanvasView); 		new Thread(new MyGameCanvas()).start(); 	}  	class MyGameCanvas implements Runnable {  		@Override 		public void run() { 			while (!Thread.currentThread().isInterrupted()) { 				try { 					Thread.sleep(1000); 				} catch (InterruptedException e) { 					e.printStackTrace(); 				} 				update(); 				_CanvasView.postInvalidate(); 			} 		} 	}  	/** 	 * 更新坐标方法 	 */ 	private void update() { 		int w = getWindowManager().getDefaultDisplay().getWidth();  		_CanvasView.x += 1; 		_CanvasView.y += 1; 		if (_CanvasView.x >= w) { 			_CanvasView.x = 0; 		} 	}


     第二种方法Handler和invalidate()结合使用:

     首先是线程方法(里面有Handler发送消息):

class MyThread implements Runnable { 		@Override 		public void run() { 			while (!Thread.currentThread().isInterrupted()) { 				try { 					Thread.sleep(100);                     //发送消息来更新界面 					 Message msg=new Message(); 					 msg.what=1; 					 mHandler.sendMessage(msg); 				} catch (InterruptedException e) { 					e.printStackTrace(); 				} 			} 		} 	} 
      接下来是Handler的接受消息的处理方法:

   

private final Handler mHandler = new Handler() { 		@Override 		public void handleMessage(Message msg) { 			super.handleMessage(msg); 			switch (msg.what) { 			case 1: 				update(); 				_CanvasView.invalidate(); 				break; 			} 		} 	};


    

      源代码下载链接:

      http://download.csdn.net/detail/jiangqq781931404/4072840