2011-02-07 123 views
5

我有一个绘图应用程序,允许用户绘制到空白画布。我试图绘制当前位图的缩放“缩略图”,以便当用户在视图中缩放时,他们可以引用缩略图以了解它们在整个绘制画布中的位置。我的缩放工作正常,并且正在将缩略图显示在正确的位置,但是当添加新的线条/形状时,缩略图似乎并未在后续的onDraw中更新。Android缩放画布位图

所以,我有机会获得潜在的位图这个观点(显示缩略图,可以很容易地将位图保存到文件等)我在onSizeChanged下列()进行查看:

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 

    // set the canvas height, panning, etc, based on the now inflated View 
    mWidth  = getWidth(); 
    mHeight  = getHeight(); 
    mAspectRatio = mWidth/mHeight; 
    mPanX  = 0; 
    mPanY  = 0; 

    // create the Bitmap, set it to the canvas 
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
mCanvas.setBitmap(mBitmap); 
draw(mCanvas); 
} 

然后,当用户绘制和无效()被调用时,我做的onDraw()以下,以生成缩略图:

@Override 
protected void onDraw(Canvas canvas) { 
    <snipped code that draws paths, shapes to canvas> 

    if (mScaled) { 
     Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int) thumbHeight, false); 
     canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 
    } 
} 

缩略图被显示在使用thumbCanvasPaint通过thumbnailRectF限定的空间,但在随后的onDraw()调用中,缩放的位图具有没有改变它的原始状态,即使全尺寸的活动画布显示了所有的绘图等。基于一些测试,在我看来,虽然我设置了初始调用画图(mCanvas)的位图,后续onDraws正在写入底层位图,而不是在onSizeChanged()中指定的位图。

因此,我想我想知道如何将onDraw画布绑定到位图,以便读取执行重新大小,保存等操作。查看this question,我认为draw(mCanvas) ;调用会将onDraw绑定到mCanvas中指定的位图(在我的例子中是mBitmap),但实际上,就更新画布而言,它似乎不起作用。

感谢,

保罗

回答

6
canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 

应更改为

canvas.drawBitmap(out, new Rect(0,0,mBitmap.getWidht, mBitmap.getheight), thumbnailRectF, thumbCanvasPaint); 

没有必要

Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int).... 

还要检查mScaled是真实的一切,当时间变焦是灰色的亚特大于1

+0

我可以看到你的解决方案whith这个例子的相似性:http://www.barebonescoder.com/2010/06/android-development-simple-2d-graphics-part-1/ – Lumis 2011-02-08 02:06:00

0

量表位图由Bitmap.createScaledBitmap然后绘制不会那么通过改变dst大小工作

用于规模将溶液在画布位图是使用此函数(从docs

void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint) 
// dst : Rect: The rectangle that the bitmap will be scaled/translated to fit into 

,你的位图大小将改变

这里是一个例子,如果我想绘制一个位图在左上方并将其缩放到100px x 120px

Bitmap bitmap = BitmapFactory.decodeResource(...);//bitmap to be drawn 

float left = 0; 
float top = 0; 
RectF dst = new RectF(left, top, left + 100, top + 120); // width=100, height=120 

canvas.drawBitmap(bitmap, null, dst, null);