下面來看看畫這麼個機器人需要些什麼東西:主要是Canvas類(android.graphics.Canvas)。Canvas類就是表示一塊畫布,你可以在上面畫你想畫的東西。當然,你還可以設置畫布的屬性,如畫布的顏色/尺寸等。Canvas提供瞭如下一些方法:
Canvas():創建一個空的畫布,可以使用setBitmap()方法來設置繪製的具體畫布;
Canvas(Bitmapbitmap):以bitmap對象創建一個畫布,則將內容都繪製在bitmap上,bitmap不得爲null;
Canvas(GLgl):在繪製3D效果時使用,與OpenGL有關;
drawColor:設置畫布的背景色;
setBitmap:設置具體的畫布;
clipRect:設置顯示區域,即設置裁剪區;
isOpaque:檢測是否支持透明;
rotate:旋轉畫布;
下面我們就用Canvas來畫一個機器人——android,ohmylove!一看就知道,機器人的外形是由矩形/圓/圓弧/線條組成的,因此要知道怎麼用Canvas畫矩形/圓/圓弧和線條。可惜阿,上面幾個方法基本都沒用上。
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(intleft,int top,int right,int bottom)
left
矩形左上角X座標值
top
矩形左上角Y座標值
right
矩形右下角X座標值
bottom
矩形右下角Y座標值
下面借用一張圖說明(忘了哪個博客找來的(*^__^*)嘻嘻……),如Rect(150, 75, 260, 120) 一目瞭然吧。
還有一點非常重要的是,屏幕最上方的狀態欄和標題欄總佔去來50的高度,同時座標原點下移到標題欄下方,即如果你的手機屏幕分辨率爲(320X480),編程時如果沒有設置去除狀態欄和標題欄,你只能操控的範圍只有(320X430),而且座標原點下移。記住咯。
//drawGraphics.java
package com.scgm.android.drawable;
import android.graphics.Canvas;
public interface drawGraphics{
public void draw(Canvascanvas);
}
package com.scgm.android.drawable;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
public classGameView extends View implements Runnable{
//聲明Paint對象
private PaintmPaint=null;
privatedrawGraphicsdrawGraphics= null;
public GameView(Context context) {
super(context);
//TODOAuto-generated constructor stub
//構建對象
mPaint= new Paint();
//開啓線程
new Thread(this).start();
}
public void onDraw(Canvas canvas){
super.onDraw(canvas);
//設置畫布爲黑色背景
//canvas.drawColor(Color.BLACK);
//消除鋸齒
mPaint.setAntiAlias(true);
//設置圖形爲空心
mPaint.setStyle(Paint.Style.STROKE);
//繪製空心幾何圖形
drawGraphics= new DrawCircle();
drawGraphics.draw(canvas);
drawGraphics= new DrawLine();
drawGraphics.draw(canvas);
drawGraphics= newDrawRect();
drawGraphics.draw(canvas);
}
@Override
public void run() {
// TODOAuto-generatedmethod stub
while(!Thread.currentThread().isInterrupted()) {
try{
Thread.sleep(1000);
} catch(InterruptedException e) {
//TODO:handle exception
Thread.currentThread().interrupt();
}
//使用postInvalidate 可以直接在線程中更新界面
postInvalidate();
}
}
}
//DrawRect.java
package com.scgm.android.drawable;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
public class DrawRect implements drawGraphics{
private Paintpaint= null;
public DrawRect(){
paint=new Paint();
}
@Override
public void draw(Canvas canvas){
// TODOAuto-generatedmethod stub
//定義圓角矩形對象
RectF rectF1 = newRectF(120,170,370,500);
RectF rectF2 = newRectF(40,150,90,400);
RectF rectF3 = newRectF(390,150,440,400);
RectF rectF4 = newRectF(140,520,200,650);
RectF rectF5 = newRectF(290,520,350,650);
paint.setAntiAlias(true);
//設置畫筆顏色爲BLUE
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);
}
}
//DrawLine.java
package com.scgm.android.drawable;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
public class DrawLine implements drawGraphics{
private Paint paint= null;
public DrawLine(){
paint= new Paint();
}
@Override
publicvoiddraw(Canvascanvas) {
// TODOAuto-generatedmethod stub
paint.setAntiAlias(true);
//繪製直線
paint.setColor(Color.GREEN);
//設置線條粗細
paint.setStrokeWidth(12);
canvas.drawLine(120,40,170,90,paint);
canvas.drawLine(320,90,370,40,paint);
}
}
//DrawCircle.java
package com.scgm.android.drawable;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
public class DrawCircle implements drawGraphics{
private Paintpaint= null;
private Paintpaint_eye= null;
public DrawCircle(){
paint= new Paint();
paint_eye= new Paint();
}
@Override
public void draw(Canvas canvas) {
// TODOAuto-generatedmethod stub
//繪製圓形(圓心x,圓心y,半徑r,畫筆p)
paint_eye.setAntiAlias(true);
paint.setAntiAlias(true);
RectF rectF = newRectF(120,60,370,240);
paint_eye.setColor(Color.WHITE);
paint.setColor(Color.GREEN);
canvas.drawCircle(190, 110, 18,paint_eye);
canvas.drawCircle(300, 110, 18,paint_eye);
canvas.drawArc(rectF, 180,180,true, paint);
}
}
//GameStart.java
package com.scgm.android.drawable;
import android.app.Activity;
import android.os.Bundle;
public class GameStart extends Activity{
private GameViewmGameView= null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.mGameView=newGameView(this);
setContentView(mGameView);
}
}