Android中動態圖形的繪制(一)

今天開始學習瞭Android中的動態圖形的繪制,直接用個例子上手;

 

    基本思路如下:

    一:創建一個繼承與View類自定義類,本例是(CanvasView),必須要有構造方法(可以使用1: public View(Context context);2: public View(Context context, AttributeSet attrs);3:public View(Context context, AttributeSet attrs, int defStyle)的其中一個);

    二:覆蓋其中的onDraw()方法;使用其中Canvas對象在界面上面繪制圖形;

    三;然後我們可以通過postInvalidate()或者invalidate()方法來調用onDraw()方法來進行圖形的重繪.

 

【註:invalidate ()和postInvalidate()方法的選擇:文檔中已經寫的很清楚瞭,如果要使用invalidate()必須要在UI主線程當中,如果不在UI主線程中,就要去調用postInValidate()】

       

      下面是我寫的一個例子:使用瞭兩種更新的方法1:Handler結合invalidate();2:直接使用postInvalidate()

實現的效果是:在屏幕上面畫一個矩形,然後開個線程,讓矩形每隔一秒改變顏色,並且矩形以x軸和y軸分別同時加+1想右下角移動.

       看下效果圖:

 

 

第一種方法代碼如下:【直接使用postInvalidate()】

[java] <span style="font-size:16px;">package com.jiangqq.csdn; 
 
/**
 * 自定義組件畫組件
 */ 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.view.MotionEvent; 
import android.view.View; 
 
public class CanvasView extends View { 
 
    public int x = 0; 
    public int y = 0; 
    public int mIndex = 0; 
//必須加入構造函數,也可以使用另外兩個構造函數  
    public CanvasView(Context context) { 
        super(context); 
        //下面兩個設置聚焦和觸摸模式,可以不設置,這裡設置瞭,因為其他地方要加入這兩個事件  
        setFocusable(true); 
        setFocusableInTouchMode(true); 
    } 
 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
        return false; 
    } 
 
    @Override 
    protected void onDraw(Canvas canvas) { 
        super.onDraw(canvas); 
        if (mIndex < 100) { 
            mIndex++; 
        } else { 
            mIndex = 0; 
        } 
        Paint _Paint = new Paint(); 
        switch (mIndex % 4) { 
        case 0: 
            _Paint.setColor(Color.RED); 
            break; 
        case 1: 
            _Paint.setColor(Color.BLUE); 
            break; 
        case 2: 
            _Paint.setColor(Color.YELLOW); 
            break; 
 
        case 3: 
            _Paint.setColor(Color.LTGRAY); 
            break; 
        } 
        canvas.drawRect(x, y, x + 100, y + 100, _Paint); 
    } 
 

</span> 
<span style="font-size:16px;">package com.jiangqq.csdn;

/**
 * 自定義組件畫組件
 */
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;

public class CanvasView extends View {

 public int x = 0;
 public int y = 0;
 public int mIndex = 0;
//必須加入構造函數,也可以使用另外兩個構造函數
 public CanvasView(Context context) {
  super(context);
  //下面兩個設置聚焦和觸摸模式,可以不設置,這裡設置瞭,因為其他地方要加入這兩個事件
  setFocusable(true);
  setFocusableInTouchMode(true);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  return false;
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  if (mIndex < 100) {
   mIndex++;
  } else {
   mIndex = 0;
  }
  Paint _Paint = new Paint();
  switch (mIndex % 4) {
  case 0:
   _Paint.setColor(Color.RED);
   break;
  case 1:
   _Paint.setColor(Color.BLUE);
   break;
  case 2:
   _Paint.setColor(Color.YELLOW);
   break;

  case 3:
   _Paint.setColor(Color.LTGRAY);
   break;
  }
  canvas.drawRect(x, y, x + 100, y + 100, _Paint);
 }

}
</span>   主Activity類如下:[java] <span style="font-size:16px;">    private CanvasView _CanvasView; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        _CanvasView = new CanvasView(this); 
        setContentView(_CanvasView); 
        new Thread(new MyGameCanvas()).start(); 
    } 
 
    class MyGameCanvas implements Runnable { 
 
        @Override 
        public void run() { 
            while (!Thread.currentThread().isInterrupted()) { 
                try { 
                    Thread.sleep(1000); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
                update(); 
                _CanvasView.postInvalidate(); 
            } 
        } 
    } 
 
    /**
     * 更新坐標方法
     */ 
    private void update() { 
        int w = getWindowManager().getDefaultDisplay().getWidth(); 
 
        _CanvasView.x += 1; 
        _CanvasView.y += 1; 
        if (_CanvasView.x >= w) { 
            _CanvasView.x = 0; 
        } 
    }</span> 
<span style="font-size:16px;"> private CanvasView _CanvasView;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  _CanvasView = new CanvasView(this);
  setContentView(_CanvasView);
  new Thread(new MyGameCanvas()).start();
 }

 class MyGameCanvas implements Runnable {

  @Override
  public void run() {
   while (!Thread.currentThread().isInterrupted()) {
    try {
     Thread.sleep(1000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    update();
    _CanvasView.postInvalidate();
   }
  }
 }

 /**
  * 更新坐標方法
  */
 private void update() {
  int w = getWindowManager().getDefaultDisplay().getWidth();

  _CanvasView.x += 1;
  _CanvasView.y += 1;
  if (_CanvasView.x >= w) {
   _CanvasView.x = 0;
  }
 }</span>

 

     第二種方法Handler和invalidate()結合使用:

     首先是線程方法(裡面有Handler發送消息):

[java] class MyThread implements Runnable { 
        @Override 
        public void run() { 
            while (!Thread.currentThread().isInterrupted()) { 
                try { 
                    Thread.sleep(100); 
                    //發送消息來更新界面  
                     Message msg=new Message(); 
                     msg.what=1; 
                     mHandler.sendMessage(msg); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
    } 
class MyThread implements Runnable {
  @Override
  public void run() {
   while (!Thread.currentThread().isInterrupted()) {
    try {
     Thread.sleep(100);
                    //發送消息來更新界面 www.aiwalls.com
      Message msg=new Message();
      msg.what=1;
      mHandler.sendMessage(msg);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 }
      接下來是Handler的接受消息的處理方法:

  

[java] private final Handler mHandler = new Handler() { 
        @Override 
        public void handleMessage(Message msg) { 
            super.handleMessage(msg); 
            switch (msg.what) { 
            case 1: 
                update(); 
                _CanvasView.invalidate(); 
                break; 
            } 
        } 
    }; 
private final Handler mHandler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);
   switch (msg.what) {
   case 1:
    update();
    _CanvasView.invalidate();
    break;
   }
  }
 };

 

   

      源代碼下載鏈接:http://download.csdn.net/detail/jiangqq781931404/4072840

摘自 要做一個給力的程序員–學習之路

 

發佈留言