Android——Canvas類的使用


Canvas類(android.graphics.Canvas)

Canvas類就是表示一塊畫布,你可以在上面畫你想畫的東西。當然,你還可以設置畫布的屬性,如畫布的顏色/尺寸等。Canvas提供了如下一些方法:

 

    Canvas():創建一個空的畫布,可以使用setBitmap()方法來設置繪制的具體畫布;

 

    Canvas(Bitmap bitmap):以bitmap對象創建一個畫布,則將內容都繪制在bitmap上,bitmap不得為null;

 

    Canvas(GL gl):在繪制3D效果時使用,與OpenGL有關;

 

    drawColor:設置畫布的背景色;

 

    setBitmap:設置具體的畫布;

 

    clipRect:設置顯示區域,即設置裁剪區;

 

    isOpaque:檢測是否支持透明;

 

    rotate:旋轉畫布;

 

 同時還要理解一個paint類,paint類擁有風格和顏色信息如何繪制幾何學,文本和位圖。

Paint 代表了Canvas上的畫筆、畫刷、顏料等等; 

Paint類常用方法:

setARGB(int a, int r, int g, int b) // 設置 Paint對象顏色,參數一為alpha透明值

setAlpha(int a) // 設置alpha不透明度,范圍為0~255

setAntiAlias(boolean aa) // 是否抗鋸齒

setColor(int color)  // 設置顏色,這里Android內部定義的有Color類包含了一些常見顏色定義

setTextScaleX(float scaleX)  // 設置文本縮放倍數,1.0f為原始

setTextSize(float textSize)  // 設置字體大小

setUnderlineText(booleanunderlineText)  // 設置下划線

  下面我們就用Canvas來畫一個機器人——android,oh my love!一看就知道,機器人的外形是由矩形/圓/圓弧/線條組成的,因此要知道怎么用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(int left,int top,int right,int bottom)

 

    left

              矩形左上角X坐標值

    top

              矩形左上角Y坐標值

    right

              矩形右下角X坐標值

    bottom

              矩形右下角Y坐標值

 

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

 

 

畫了個Android——Canvas類的使用

    還有一點非常重要的是,屏幕最上方的狀態欄和標題欄總占去來50的高度,同時坐標原點下移到標題欄下方,即如果你的手機屏幕分辨率為(320X480),編程時如果沒有設置去除狀態欄和標題欄,你只能操控的范圍只有(320X430),而且坐標原點下移。記住咯。

 

//drawGraphics.java

package  com.scgm.android.drawable;

import android.graphics.Canvas;

 

 

public interface  drawGraphics {

public void  draw(Canvas canvas);

}

 

 

 

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  Paint mPaint= null;

       privatedrawGraphics drawGraphics= 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-generated method 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  Paint paint=  null;

 

       public DrawRect(){

       paint= new  Paint();

}

 

      

         @Override

         public void  draw(Canvas canvas) {

             // TODOAuto-generated method 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(Canvas canvas) {

            // TODOAuto-generated method 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  Paint paint=  null;

        private  Paint paint_eye=  null;

 

        public  DrawCircle(){

        paint= new  Paint();

        paint_eye= new  Paint();

}

      

        @Override

        public  void draw(Canvas canvas) {

             // TODOAuto-generated method 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  GameView mGameView=  null

 

    

      @Override

      public  void  onCreate(Bundle  savedInstanceState) { 

          super.onCreate(savedInstanceState);

          this.mGameView= newGameView(this);

          setContentView(mGameView);

      }

}

 

 

運行效果圖:

 

                         畫了個Android——Canvas類的使用

 

 

 

      還可以吧?:-)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM