Android游戏开发技术实战详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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 执行效果