- <span style="font-size:18px;"> </span>
- <span style="font-size:18px;"></span>
繪圖之前,首先需要調整畫筆,待畫筆調整好之后,再將圖像繪制到畫布上,這樣才可以顯示在手機屏幕上!Android 中的畫筆是 Paint類,Paint 中包含了很多方法對其屬性進行設置,主要常用方法:
setAntiAlias: 設置畫筆的鋸齒效果。
setColor: 設置畫筆顏色
setARGB: 設置畫筆的a,r,p,g值。
setAlpha: 設置Alpha值
setTextSize: 設置字體尺寸。
setStyle: 設置畫筆風格,空心或者實心。
setStrokeWidth: 設置空心的邊框寬度。
getColor: 得到畫筆的顏色
getAlpha: 得到畫筆的Alpha值。
自定義控件時常常遇到重寫View的Ondraw()方法,Ondraw()方法常常設計到save()和restore()這兩個方法
,現結合demo簡單分析一下這兩個方法的作用:
1.save():用來保存Canvas的狀態,save()方法之后的代碼,可以調用Canvas的平移、放縮、旋轉、裁剪等操作!
2.restore():用來恢復Canvas之前保存的狀態,防止save()方法代碼之后對Canvas執行的操作,繼續對后續的繪制會產生影響,通過該方法可以避免連帶的影響!
通過一個例子說明一下:
例如:我們想在畫布上繪制一個向右的三角箭頭,當然,我們可以直接繪制,另外,我們也可以先把畫布旋轉90°,畫一個向上的箭頭,然后再旋轉回來(這種旋轉操作對於畫圓周上的標記非常有用),最后,我們在右下角繪一個20像素的圓!
代碼:
- <span style="font-size:18px;">package com.test.ui;
- import android.R.color;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.view.View;
- public class GameView extends View {
- public final static String TAG = "Example_05_03_GameView";
- // 聲明Paint對象
- private Paint mPaint = null;
- public GameView(Context context) {
- super(context);
- mPaint = new Paint();
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- Paint background=new Paint();
- Paint line=new Paint();
- background.setColor(color.darker_gray);
- line.setColor(Color.RED);
- int px = getMeasuredWidth();
- int py = getMeasuredWidth();
- // Draw background
- canvas.drawRect(0, 0, px, py, background);
- canvas.save();
- canvas.rotate(90, px/2, py/2);
- //畫一個向上的箭頭
- canvas.drawLine(px / 2, 0, 0, py / 2, line); //左邊的斜杠
- canvas.drawLine(px / 2, 0, px, py / 2, line);//右邊的斜杠
- canvas.drawLine(px / 2, 0, px / 2, py, line);//垂直的豎杠
- canvas.restore();
- // Draw circle
- canvas.drawCircle(px - 10, py - 10, 10, line);
- }
- }
- </span>
MainActivity.Java:
- <span style="font-size:18px;">package com.test.ui;
- import android.app.Activity;
- import android.os.Bundle;
- public class MainActivity extends Activity {
- private GameView mGameView;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mGameView = new GameView(this);
- setContentView(mGameView);
- }
- }
- </span>
運行結果:
如果將 canvas.save()和canvas.restore()注釋掉,那么圓點將會隨着之前的90旋轉跑到了左邊,沒有達到你預期想要顯示在右下角的效果:
以上我們很明顯看到圓圈位置的明顯差異。不進行Canvas的save和restore操作的話,所有的圖像都是在畫布旋轉90°后的畫布上繪制的。當執行完onDraw方法,系統自動將畫布恢復回來。save和restore操作執行的時機不同,就能繪制不同的圖形,save和restore之間,往往是對Canvas的特殊操作!