歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Andriod中繪(畫)圖----Canvas的使用詳解

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

日期:2017/3/1 10:35:08   编辑:Linux編程
由於在網絡上找到關於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. Bitmap bitmap = Bitmap.createBitmap(200, 100, Config.ARGB_8888) ;
  3. //創建一個canvas對象,並且開始繪圖
  4. Canvas canvas = new Canvas (bitmap) ;
  5. ImageView imgView = new ImageView(this) ; //或者其他可以設置背景圖片的View控件
  6. //為ImageView設置圖像
  7. //將Bitmap對象轉換為Drawable圖像資
  8. Drawable drawable = new BitmapDrawable(bitmap) ;
  9. imgView .setBackgroundDrawable(drawable) ;
  10. 或者簡單點: 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