- Android游戏开发技术实战详解
- 褚尚军 张加春编著
- 845字
- 2020-08-28 23:29:50
4.4 画布类Canvas
Canvas类的完整写法是android.graphics. Canvas,有“画布”之意。我们可以将其看做是一种处理过程,使用各种方法来管理Bitmap、GL或者Path路径,同时它可以配合Matrix矩阵类对图像做旋转、缩放等操作,同时Canvas类还提供了裁剪、选取等操作。在类Canvas中提供了如下常用的方法。
· Canvas():创建一个空的画布,可以使用setBitmap()方法来设置绘制的具体画布;
· Canvas(Bitmap bitmap):以bitmap对象创建一个画布,将内容都绘制在bitmap上,bitmap不能为null;
· Canvas(GL gl):在绘制3D效果时使用,与OpenGL有关;
· drawColor:设置画布的背景色;
· setBitmap:设置具体的画布;
· clipRect:设置显示区域,即设置裁剪区;
· isOpaque:检测是否支持透明;
· rotate:旋转画布;
· canvas.drawRect(RectF,Paint):用于绘制矩形,其中第1个参数是图形显示区域,第2个参数是画笔,设置好图形显示区域RectF和画笔Paint后就可以画图;
· canvas.drawRoundRect(RectF, float, float, Paint) :用于绘制圆角矩形,第1个参数为图形显示区域,第2个参数和第3个参数分别是水平圆角半径和垂直圆角半径;
· canvas.drawLine(startX, startY, stopX, stopY, paint):前4个参数的类型均为float,最后一个参数类型为Paint。表示用画笔paint从点(startX,startY)到点(stopX,stopY)画一条直线;
· canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint):第1个参数oval为RectF类型,即圆弧显示区域,startAngle和sweepAngle均为float类型,分别表示圆弧起始角度和圆弧度数,3点钟方向为0度,useCenter设置是否显示圆心(boolean类型),paint表示画笔;
· canvas.drawCircle(float,float, float, Paint):用于绘制圆,前两个参数代表圆心坐标,第3个参数为圆半径,第4个参数是画笔。
实例4-3 在Android中使用Canvas类(daima\4\CanvasCH)。
本实例的实现文件是CanvasCH.java,主要代码如下所示。
/* 声明Paint对象 */ private Paint mPaint = null; public CanvasCH(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(); } } }
执行后的效果如图4-3所示。
图4-3 执行效果