歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Andriod中繪(畫)圖----Canvas的使用詳解

由於在網絡上找到關於Canvas的使用都比較抽象,也許是我的邏輯思維不太好吧,總是感覺理解起來比較困難,

    尤其是對save()和restore()方法的使用。本篇文章的內容就是對Canvas的使用進行一下總結,包括它的兩種不同的使用

    情節和它的一些方法進行一下說明。 

  

       1  Bitmap,可以來自資源/文件,也可以在程序中創建,實際上的功能相當於圖片的存儲空間;

       2  Canvas,緊密與Bitmap聯系,把Bitmap比喻內容的話,那麼Canvas就是提供了眾多方法操作Bitamp的平台;

       3  Paint,與Canvas緊密聯系,是"畫板"上的筆刷工具,也用於設置View控件上的樣式;

       4  Drawable,如果說前三者是看不見地在內存中畫圖(虛擬的),那麼Drawable就是把前三者繪圖結果表現出來的接口(真實的)。

              Drawable多個子類,例如:位圖(BitmapDrawable)、圖形(ShapeDrawable)、圖層(LayerDrawable)等。  

 

    我們打個簡單的比方吧:

                Paint        就是畫筆

                Bitmap    就是畫布

                Canvas   就是畫家

 

     於是,畫家可以通過畫筆可以在畫布上進行任何的畫畫。

 

Canvas的兩種使用情形,從Canvas對象的獲得角度分析:

 

    1、  自定義View和自定義SurfaceView中獲得Canvas對象

       由於自定義View和SurfaceView在顯示界面中已經獲得了顯示區域,canvas對象只不過是在其顯示(繪畫)區域進行界面布局

  的設計,當操作完畢後,系統會顯示canvas的操作結果。

 

       自定義View的繪圖方法為:

[java]
  1. //存在canvas對象,即存在默認的顯示區域   
  2.     @Override  
  3.     public void draw(Canvas canvas) {  
  4.          //canvas繪圖   
  5.         }  


      SurfaceView的繪圖方法為,例如:

[java]
  1. SurfaceView  surfaceView = new MySurfaceView() ;         //創建一個Surface對象   
  2. SurfaceHolder surfaceHolder = surfaceView. getHolder() ;  //獲得SurfaceHolder對象   
  3. Canvas   canvas  = surfaceHolder.lockCanvas() ;          //獲得canvas對象   
  4. //進行繪圖操作   
  5. surfaceHolder.unlockCanvasAndPost(canvas) ;            //釋放canvas鎖,並且顯示視圖  

 

    2、  在其他情形下,我們需要通過代碼創建一個Canvas對象,並且在繪畫成功後,將該畫圖區域轉換為Drawable圖片

  或者通過setBitmap(bitmap)顯現出來。一般步驟為: 

[java]
  1. //創建一個的Bitmap對象    
  2.   
  3.    Bitmap bitmap = Bitmap.createBitmap(200100, Config.ARGB_8888) ;  
  4.   //創建一個canvas對象,並且開始繪圖   
  5.    Canvas canvas = new Canvas (bitmap) ;  
  6.   
  7.   ImageView imgView  = new ImageView(this) ;  //或者其他可以設置背景圖片的View控件   
  8.    
  9.   
  10.    //為ImageView設置圖像   
  11.    //將Bitmap對象轉換為Drawable圖像資   
  12.    Drawable drawable = new BitmapDrawable(bitmap) ;  
  13.   imgView .setBackgroundDrawable(drawable) ;  
  14.   
  15.   
  16.   或者簡單點:  imgView  .setImageBitmap(bitmap);     

     這兩種方式都可以顯示我們的繪圖。
 

 Canvas方法分析:

 

         clipXXX()方法族

           說明:在當前的畫圖區域裁剪(clip)出一個新的畫圖區域,這個畫圖區域就是canvas對象的當前畫圖區域了。

              例如:clipRect(new Rect()),那麼該矩形區域就是canvas的當前畫圖區域了。

        public int save()

           說明:保存已經由canvas繪畫出來的東西,在save()和restore()方法之間的操作不對它們造成影響,例如旋轉(roate)等。

               而且對canvas的操作(roate和translate)都是臨時的,restore()後不再存在。

       public voidrestore()

           說明:復原sava()方法之前保存的東西資源。

       drawXXX()方法族

           說明:以一定的坐標值在當前畫圖區域畫圖。

           注意:圖層會疊加,即後面繪畫的圖層會覆蓋前面繪畫的圖層。

 

 需要注意的方法是:

     public voiddrawRect(float left, float top, float right, float bottom,Paint paint)

           說明:繪制一個矩型。需要注明的是繪制矩形的參數和Java中的方法不一樣。

              該方法的參數圖解說明如下:

 

          

           那麼,矩形的高 height = bottom  - right 

                      矩形的寬 width  = right – left

 

       PS :假如drawRect的參數有誤,比如right < left ,Android是不會給我們檢查的,也不會提示相應的錯誤信息,

           但它會繪畫出一個高或寬很小的矩形,可能不是你希望的。

  

      public voidtranslate(float dx, float dy)

          說明:在當前的坐標上平移(x,y)個像素單位

                    若dx <0 ,沿x軸向上平移; dx >0  沿x軸向下平移

                    若dy <0 ,沿y軸向上平移; dy >0  沿y軸向下平移

     public void rotate(float degrees)

          說明:旋轉一定的角度繪制圖像。

         

         PS :從截圖上看,圖像是確實旋轉了,但是我找不到旋轉的依據中心。

 

下面給出該Demo的截圖,可以更改一些參數後自己觀察效果。

 

Copyright © Linux教程網 All Rights Reserved