原创: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(150, 75, 260, 120)
left top right bottom
不是左 上 右 下
left : 矩形左边的X坐标 150 ---->图片中的A点
top: 矩形顶部的Y坐标 75 ---->图片中的B点
right : 矩形右边的X坐标 260 ----->图片中的C点
bottom: 矩形底部的Y坐标 120 ------->图片中的D点