Canvas简单使用(一)

来源:互联网 发布:陕西省大数据集团公司 编辑:程序博客网 时间:2024/06/05 02:28

原创:http://byandby.javaeye.com/blog/825330

当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了。在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西。除了在画布上绘制之外,还需要设置一些关于画布的属性,比如,画布的颜色、尺寸等。下面来分析Android中Canvas有哪些功能,Canvas提供了如下一些方法:
    Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布。
    Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,则将内容都绘制在bitmap上,因此bitmap不得为null。
    Canvas(GL gl): 在绘制3D效果时使用,与OpenGL相关。
    drawColor: 设置Canvas的背景颜色。
    setBitmap:  设置具体画布。
    clipRect: 设置显示区域,即设置裁剪区。
    isOpaque:检测是否支持透明。
    rotate:  旋转画布
    setViewport:  设置画布中显示窗口。
    skew:  设置偏移量。

 

GameView的代码:

package cn.edu.wtu.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
//
public class GameView extends View implements Runnable{

 private Paint mPaint;
 public GameView(Context context) {
  super(context);
  // TODO Auto-generated constructor stub
  mPaint=new Paint();
  new Thread(this).start();
  Log.e("debug","GameView constructor");
 }

 public void onDraw(Canvas canvas){
  
  super.onDraw(canvas);
  canvas.drawColor(Color.BLACK);
  mPaint.setAntiAlias(true);
//  left top right bottom
  canvas.clipRect(0,0,280,260);
//  先锁定画布
  canvas.save();
//  旋转画布
//  顺时针旋转
  canvas.rotate(45.0f);
//  设置颜色及绘制矩形
  mPaint.setColor(Color.RED);
  canvas.drawRect(new Rect(15,15,140,70),mPaint);
//  解除画布锁定
  canvas.restore();
//  设置颜色及绘制另一个矩形
  mPaint.setColor(Color.GREEN);
//  left top rigth bottom
  canvas.drawRect(new Rect(150,75,260,120),mPaint);
  Log.e("debug","draw.....");
 }
  
 @Override
 public void run() {
  // TODO Auto-generated method stub
  while(!Thread.currentThread().isInterrupted()){
   try{
    Thread.sleep(1000);
   }catch(InterruptedException e){
    Thread.currentThread().interrupt();
   }
//   使用该函数可以直接在线程中更新界面
   postInvalidate();
  }
 }
// 触笔事件
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  // TODO Auto-generated method stub
  return super.onTouchEvent(event);
 }
 
// 按键弹起事件
 @Override
 public boolean onKeyUp(int keyCode, KeyEvent event) {
  // TODO Auto-generated method stub
  return super.onKeyUp(keyCode, event);
 }
 //按健按下事件
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  // TODO Auto-generated method stub
  return super.onKeyDown(keyCode, event);
 }

 @Override
 public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
  // TODO Auto-generated method stub
  return super.onKeyMultiple(keyCode, repeatCount, event);
 }
 
}

测试用的Activity

package cn.edu.wtu;

import android.app.Activity;
import android.os.Bundle;
import cn.edu.wtu.view.GameView;

public class TestView extends Activity {

 private GameView mGameView=null;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  mGameView=new GameView(this);
  setContentView(mGameView);
 }
}

结果就不贴图了,调试信息:

03-10 09:05:24.390: ERROR/debug(627): GameView constructor
03-10 09:05:24.680: ERROR/debug(627): draw.....
03-10 09:05:24.918: ERROR/debug(627): draw.....
03-10 09:05:25.429: ERROR/debug(627): draw.....
 

解说:

new Rect(15075260120

left  top  right   bottom

不是左 上 右 下

left : 矩形左边的X坐标   150        ---->图片中的A点
top:    矩形顶部的Y坐标    75         ---->图片中的B点
right :  矩形右边的X坐标    260       ----->图片中的C点
bottom: 矩形底部的Y坐标  120     ------->图片中的D点