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爲畫筆;
繪製圓角矩形類:
繪製機器人腦袋類;
繪製機器人耳朵類:
GameView類:
最後在Acticity中設置顯示
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中設置顯示