在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: 设置偏移量。

上面列举了几个常用的方法。在游戏开发中,我们可能需要对某个精灵执行旋转、缩放和一些其它操作。我们可以通过旋转画布来实现,但是旋转画布时会旋转画布上的所有对象,而我们只是需要旋转其中的一个,这时就需要用到save 方法来锁定需要操作的对象,在操作之后通过 restore 方法来解除锁定,下面我们先来看一下运行效果吧。

我们对左边的矩形执行了旋转操作,而没有旋转右边的矩形,由于我们设置了裁剪区域,因此左边的矩形只能看到一部分,下面让我们来看看代码 这里我只贴出了我们自己的 View类 GameView Activity类不贴出了 就在里边 new 一个GameView类 然后设置布局 然后main.xml也不贴出来了 因为它根本就没用到。

Java代码
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

public class GameView extends View implements Runnable {
/* 声明Paint对象 */
private Paint mPaint = null;

public GameView(Context context) {
super(context);
/* 构建对象 */
mPaint = new Paint();

/* 开启线程 */
new Thread(this).start();
}

public void onDraw(Canvas canvas) {
super.onDraw(canvas);

/* 设置画布的颜色 */
canvas.drawColor(Color.BLACK);

/* 设置取消锯齿效果 */
mPaint.setAntiAlias(true);

/* 设置裁剪区域 */
canvas.clipRect(10, 10, 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);
canvas.drawRect(new Rect(150, 75, 260, 120), mPaint);
}

// 触笔事件
public boolean onTouchEvent(MotionEvent event) {
return true;
}

// 按键按下事件
public boolean onKeyDown(int keyCode, KeyEvent event) {
return true;
}

// 按键弹起事件
public boolean onKeyUp(int keyCode, KeyEvent event) {
return false;
}

public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
return true;
}

public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// 使用postInvalidate可以直接在线程中更新界面
postInvalidate();
}
}
}

更多相关文章

  1. android点滴(29) android中设置用户自定义的字体
  2. 2014-11-8Android学习------Android(安卓)实现图片的旋转-------
  3. Android(安卓)Studio 小技巧(2):AS中Button文字默认大写的问题
  4. android中的Notification使用
  5. Android(安卓)Schema的妙用
  6. Android-TextView
  7. Android(安卓)动画实现
  8. Android横竖屏总结全
  9. android资源引用

随机推荐

  1. 《Android4游戏编程入门经典》读后感
  2. 把android 主板打造成ip摄像头
  3. 30个高质量并且免费的Android图标【Andro
  4. 《android framework常用api源码分析》之
  5. Android 中的注解详细介绍
  6. Android 获取手机存储信息详解(内存,外存等
  7. Delphi XE5 for Android(安卓)(七)
  8. Android智能手机搜索不到路由器无线信号
  9. 关于android的广播接收器(1)—基础篇
  10. Android的消息机制之Handler源码解析