官术网_书友最值得收藏!

4.4 畫布類Canvas

Canvas類的完整寫法是android.graphics. Canvas,有“畫布”之意。我們可以將其看做是一種處理過程,使用各種方法來管理Bitmap、GL或者Path路徑,同時(shí)它可以配合Matrix矩陣類對圖像做旋轉(zhuǎn)、縮放等操作,同時(shí)Canvas類還提供了裁剪、選取等操作。在類Canvas中提供了如下常用的方法。

· Canvas():創(chuàng)建一個(gè)空的畫布,可以使用setBitmap()方法來設(shè)置繪制的具體畫布;

· Canvas(Bitmap bitmap):以bitmap對象創(chuàng)建一個(gè)畫布,將內(nèi)容都繪制在bitmap上,bitmap不能為null;

· Canvas(GL gl):在繪制3D效果時(shí)使用,與OpenGL有關(guān);

· drawColor:設(shè)置畫布的背景色;

· setBitmap:設(shè)置具體的畫布;

· clipRect:設(shè)置顯示區(qū)域,即設(shè)置裁剪區(qū);

· isOpaque:檢測是否支持透明;

· rotate:旋轉(zhuǎn)畫布;

· canvas.drawRect(RectF,Paint):用于繪制矩形,其中第1個(gè)參數(shù)是圖形顯示區(qū)域,第2個(gè)參數(shù)是畫筆,設(shè)置好圖形顯示區(qū)域RectF和畫筆Paint后就可以畫圖;

· canvas.drawRoundRect(RectF, float, float, Paint) :用于繪制圓角矩形,第1個(gè)參數(shù)為圖形顯示區(qū)域,第2個(gè)參數(shù)和第3個(gè)參數(shù)分別是水平圓角半徑和垂直圓角半徑;

· canvas.drawLine(startX, startY, stopX, stopY, paint):前4個(gè)參數(shù)的類型均為float,最后一個(gè)參數(shù)類型為Paint。表示用畫筆paint從點(diǎn)(startX,startY)到點(diǎn)(stopX,stopY)畫一條直線;

· canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint):第1個(gè)參數(shù)oval為RectF類型,即圓弧顯示區(qū)域,startAngle和sweepAngle均為float類型,分別表示圓弧起始角度和圓弧度數(shù),3點(diǎn)鐘方向?yàn)?度,useCenter設(shè)置是否顯示圓心(boolean類型),paint表示畫筆;

· canvas.drawCircle(float,float, float, Paint):用于繪制圓,前兩個(gè)參數(shù)代表圓心坐標(biāo),第3個(gè)參數(shù)為圓半徑,第4個(gè)參數(shù)是畫筆。

實(shí)例4-3 在Android中使用Canvas類(daima\4\CanvasCH)。

本實(shí)例的實(shí)現(xiàn)文件是CanvasCH.java,主要代碼如下所示。

/* 聲明Paint對象 */
private Paint mPaint   = null;
public CanvasCH(Context context)
{
    super(context);
    /* 構(gòu)建對象 */
    mPaint = new Paint();
    /* 開啟線程 */
    new Thread(this).start();
}
public void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    /* 設(shè)置畫布的顏色 */
    canvas.drawColor(Color.BLACK);
    /* 設(shè)置取消鋸齒效果 */
    mPaint.setAntiAlias(true);
    /* 設(shè)置裁剪區(qū)域 */
    canvas.clipRect(10, 10, 280, 260);
    /* 首先鎖定畫布 */
    canvas.save();
    /* 旋轉(zhuǎn)畫布 */
    canvas.rotate(45.0f);
    /* 設(shè)置顏色及繪制矩形 */
    mPaint.setColor(Color.RED);
    canvas.drawRect(new Rect(15,15,140,70), mPaint);
    /* 解除畫布的鎖定*/
    canvas.restore();
    /* 設(shè)置顏色及繪制另一個(gè)矩形 */
    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();
    }
  }
}

執(zhí)行后的效果如圖4-3所示。

圖4-3 執(zhí)行效果

主站蜘蛛池模板: 津南区| 赫章县| 西宁市| 监利县| 瑞丽市| 甘孜县| 三台县| 营山县| 山东省| 新河县| 达州市| 象山县| 天等县| 保定市| 安新县| 衡东县| 苏尼特左旗| 彭泽县| 天峻县| 铜鼓县| 米泉市| 北安市| 乌兰察布市| 监利县| 崇州市| 乌苏市| 邮箱| 东莞市| 延边| 遵义县| 江孜县| 根河市| 赞皇县| 吴桥县| 伊金霍洛旗| 广昌县| 泰来县| 深圳市| 临沂市| 湖南省| 宁陵县|