2011-10-08 102 views
1

我期待在从谷歌的示例应用程序,它采用触摸绘图用帆布交易之一:的Android - 画布绘制怀疑

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html

我有几个疑惑:

  1. 我无法理解Canvas与位图角色 的作用。

  2. drawPoint功能,我不能够 了解此代码段:

mCanvas.drawCircle(x, y, radius, mPaint); 
mRect.set((int) (x - radius - 2), (int) (y - radius - 2), 
      (int) (x + radius + 2), (int) (y + radius + 2)); 
invalidate(mRect); 

如果循环已经被拉入上面的帆布,然后什么情况onDraw功能,其中给出以下代码:

canvas.drawBitmap(mBitmap, 0, 0, null);

回答

2

帆布VS位图

一个Bitmap是什么顾名思义:一个正常的图像作为位图。 Canvas类是位图编辑器。您使用它来更改位图数据,它包含所有绘图方法。这个原则的行为类似于共享首选项(如果你已经与他们合作),你有一个SharedPreferences类拥有的偏好,和Editor类改变的东西。

绘制圆

此代码类似于double buffering东西。 drawPoint()基本上画了一个圆圈到mBitmap对象1中。 但是此位图对象尚不可见。它存在于内存中。当调用onDraw()时,它有一个代表视图的绘图表面的参数CanvasdrawBitmap()在这里所做的就是使用内存中的准备好的位图并在视图图形表示中绘制它,以使其可见。

¹用过的画布mCanvas绑定到mBitmaponSizeChanged()

+0

在'drawPoint()',圆圈绘图调用不涉及任何位图了!请参阅:'mCanvas.drawCircle(x,y,radius,mPaint);'这是如何工作的? – jeffreyveon

+0

是的,这就是我的¹点意味着什么。当mBitmap以特定大小创建时,mCanvas被分配给它(行'newCanvas.setBitmap(newBitmap);',稍后在'mBitmap = newBitmap; mCanvas = newCanvas')。从此mCanvas编辑“mBitmap”中的数据。这里使用'mCanvas',它包含第一段描述的绘图函数'drawCircle()'。该圆圈被绘制在位图所保存的像素数据中。 :) – 2011-10-08 16:00:59

+0

太棒了,非常感谢。现在很清楚。 – jeffreyveon

0
  1. 从Android SDK:

    Canvas类持有的 “画” 的电话。要绘制东西,您需要4个基本组件:A Bitmap来保存像素,一个Canvas来承载绘制调用(写入位图),绘制原语(例如Rect,Path,文本,位图)和绘制(描述绘图的颜色和样式)。

  2. 我假设你指的这个片段:

    @Override protected void onDraw(Canvas canvas) { 
        if (mBitmap != null) { 
         canvas.drawBitmap(mBitmap, 0, 0, null); 
        } 
    } 
    

    那么它看起来像一个继承onDraw方法,它在默认情况下可能是“什么也不做”的覆盖,因此覆盖实际上给它一些行为,在这种情况下,给定一个非null的位图实例,使画布绘制它。

0

如果你去developper REFFERENCE:

drawBitmap(位图位图,左浮动,浮顶,油漆涂料)

绘制 指定的位图,其顶部/ (x,y)处的左角,使用由当前矩阵转换的指定颜色。

然后,如果你看到mBitmap不在类的存在,这就是导致该变种来源于从另一个活动的延伸。

Canvas也有一个setBitmap(位图位图)函数。那么解决方法就是在画布上绘制,如果你已经设置了一个位图对象。