Canvas類和Paint的繪製機器人

   canvas.drawRect(RectF,Paint)方法用於畫矩形,第一個參數爲圖形顯示區域,第二個參數爲畫筆,設置好圖形顯示區域Rect和畫筆Paint後,即可畫圖;


    canvas.drawRoundRect(RectF, float, float, Paint) 方法用於畫圓角矩形,第一個參數爲圖形顯示區域,第二個參數和第三個參數分別是水平圓角半徑和垂直圓角半徑。


    canvas.drawLine(startX, startY, stopX, stopY, paint):前四個參數的類型均爲float,最後一個參數類型爲Paint。表示用畫筆paint從點(startX,startY)到點(stopX,stopY)畫一條直線;


    canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint):第一個參數oval爲RectF類型,即圓弧顯示區域,startAngle和sweepAngle均爲float類型,分別表示圓弧起始角度和圓弧度數,3點鐘方向爲0度,useCenter設置是否顯示圓心,boolean類型,paint爲畫筆;


    canvas.drawCircle(float,float, float, Paint)方法用於畫圓,前兩個參數代表圓心座標,第三個參數爲圓半徑,第四個參數是畫筆;

清楚這些函數的用法之後,我們是否就噼裏啪啦地敲代碼了呢?別急,我們來搞個設計。既然這些函數都是用來畫圖的,也就是說它們有共性——畫。所有我們應該設計一個接口interface,對於這次任務,只需要一個成員方法就足夠了。對於每一個圖形,是隻用一個方法畫,還是將畫圖封裝成類呢?我建議是封裝成類。因爲說不定你明天就會嫌棄它不會動,想它動起來,或者你過兩天又希望在機器人的每個部位加點什麼。所以我將每一個圖形封裝成類,都實現一個名叫drawGraphics的接口。最後,要記得給UI創建一個線程哦。



   就這樣我開始動手做了,但是很快就發現問題了。什麼問題?在定位的時候,也就是設置每個圖形的顯示區域時,我自以爲這裏的Rect跟Java的Rectangle是一樣的,但我錯了。原來這廝跟MFC中的RECT結構纔是一家人,害我折騰了許久。


    Rect(int left,int top,int right,int bottom)
 
    left
              矩形左上角X座標值
    top
              矩形左上角Y座標值
    right
              矩形右下角X座標值
    bottom
              矩形右下角Y座標值


   下面借用一張圖說明(忘了哪個博客找來的(*^__^*) 嘻嘻……),如Rect(150, 75, 260, 120) 一目瞭然吧。


接口類:

package com.hanfeng.graphicsdemo03;

import android.graphics.Canvas;

public interface DrawGraphics {
	public void draw(Canvas canvas);
}

繪製圓角矩形類:

package com.hanfeng.graphicsdemo03;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
/**
 * 繪製矩形
 * @author hanfeng
 * @data 2012-8-19 下午3:31:35
 */
public class DrawRect implements DrawGraphics {
	private Paint paint = null;
	public DrawRect(){
		paint = new Paint();
	}
	@Override
	public void draw(Canvas canvas) {
		/*定義圓角矩形*/
        RectF rectF1 = new RectF(120,170,370,500);
        RectF rectF2 = new RectF(40,150,90,400);
        RectF rectF3 = new RectF(390,150,440,400);
        RectF rectF4 = new RectF(140,520,200,650);
        RectF rectF5 = new RectF(290,520,350,650);
        /*消除畫筆鋸齒*/
        paint.setAntiAlias(true);
        /*設置畫筆顏色*/
        paint.setColor(Color.GREEN);
        /*在畫布上繪製圓角矩形*/
        canvas.drawRoundRect(rectF1, 20, 20, paint);   
        canvas.drawRoundRect(rectF2, 20, 20, paint);  
        canvas.drawRoundRect(rectF3, 20, 20, paint);  
        canvas.drawRoundRect(rectF4, 20, 20, paint);  
        canvas.drawRoundRect(rectF5, 20, 20, paint);  
        
	}

}

繪製機器人腦袋類;

package com.hanfeng.graphicsdemo03;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
/**
 * 繪製圓形
 * @author hanfeng
 * @data 2012-8-19 下午4:36:28
 */
public class DrawCircle implements DrawGraphics {
	/*機器人腦袋瓜*/
	private Paint paint = null;
	/*機器人眼睛*/
	private Paint paint_eye = null;
	
	public DrawCircle(){
		paint = new Paint();
		paint_eye = new Paint();
	}

	@Override
	public void draw(Canvas canvas) {
		paint.setAntiAlias(true);
		paint_eye.setAntiAlias(true);
		paint.setColor(Color.GREEN);		
		paint_eye.setColor(Color.WHITE);
		RectF rectF = new RectF(120,60,370,240);
		canvas.drawArc(rectF, 180, 180, false, paint);		
		//繪製圓形(圓心x,圓心y,半徑r,畫筆p)
		canvas.drawCircle(190, 110, 18, paint_eye);
		canvas.drawCircle(300, 110, 18, paint_eye);
	}

}

繪製機器人耳朵類:

package com.hanfeng.graphicsdemo03;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

/**
 * 繪製耳朵類
 * @author hanfeng
 * @data 2012-8-19 下午4:37:02
 */
public class DrawLine implements DrawGraphics {
	private Paint paint = null;
	
	public DrawLine(){
		paint = new Paint();
	}

	@Override
	public void draw(Canvas canvas) {
		paint.setAntiAlias(true);
		paint.setColor(Color.GREEN);
		paint.setStrokeWidth(2);
		canvas.drawLine(120,40,170,90, paint);
        canvas.drawLine(320,90,370,40, paint);
	}

}

GameView類:

package com.hanfeng.graphicsdemo03;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.View;

public class GameView extends View implements Runnable {
	//聲明Oaint對象
	private Paint paint = null;
	private DrawGraphics drawGraphics = null;

	public GameView(Context context) {
		super(context);
		/*構建Paint對象*/
		paint = new Paint();
		/*開啓線程*/
		new Thread(this).start();
	}
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		/*設置畫布顏色*/
		canvas.drawColor(Color.BLACK);
		/*設置筆刷無鋸齒*/
		paint.setAntiAlias(true);
		/*設置圖形爲空心的*/
		paint.setStyle(Style.STROKE);
		/*開始繪製幾何圖形*/
		drawGraphics = new DrawRect();
		drawGraphics.draw(canvas);
		drawGraphics = new DrawCircle();
		drawGraphics.draw(canvas);
		drawGraphics = new DrawLine();
		drawGraphics.draw(canvas);
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (!Thread.currentThread().isInterrupted()) {
			try {
				Thread.sleep(200);
			} catch (Exception e) {
				Thread.currentThread().isInterrupted();
			}
			//使用postInvalidate在線程中更新界面
			postInvalidate();
		}
	}

}

最後在Acticity中設置顯示



發佈了20 篇原創文章 · 獲贊 3 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章