畫了個Android——Canvas類的使用

今晚瞎折騰,閒着沒事畫了個機器人——android,浪費了一個晚上的時間。畫這丫還真不容易,爲那些座標,差點砸了鍵盤,好在最後畫出個有模有樣的,心稍安。

  下面來看看畫這麼個機器人需要些什麼東西:主要是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) 一目瞭然吧。


畫了個Android鈥斺擟anvas類的使用

還有一點非常重要的是,屏幕最上方的狀態欄和標題欄總佔去來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);

         //繪製空心幾何圖形

         drawGraphicsnew  DrawCircle();

         drawGraphics.draw(canvas);

         drawGraphicsnew  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  Paintpaintnull;

 

     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 paintnull;

 

      public  DrawLine(){

         paintnew  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  Paintpaintnull;

      private  Paintpaint_eyenull;

 

      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  GameViewmGameViewnull

 

   

     @Override

     public  void  onCreate(Bundle  savedInstanceState){ 

        super.onCreate(savedInstanceState);

        this.mGameView=newGameView(this);

        setContentView(mGameView);

     }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章