Android 缩放画布位图

7
我有一个绘图应用程序,允许用户在空白画布上绘制。我试图绘制当前位图的缩放“缩略图”,以便当用户在视图中进行缩放时,他们可以引用缩略图来了解整个绘图画布的位置。我已经使缩放工作,并在正确的位置显示缩略图,但是似乎缩略图在添加新线条/形状后不会更新。

为了能够访问此视图的底层位图(显示缩略图,轻松将位图保存到文件等),我在View的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);
}

然后,当用户绘制并调用invalidate()时,在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()调用中,缩放的位图未从其原始状态更改,即使全尺寸活动画布显示所有的绘制等。根据一些测试,我觉得当我通过最初的draw(mCanvas)调用设置位图时,随后的onDraws会写入底层位图,而不是在onSizeChanged()中指定的位图。
所以,我想知道如何将onDraw画布与我可以轻松访问的位图相结合,以执行重新调整大小、保存等操作。看到this question,我认为draw(mCanvas)调用会将onDraw与mCanvas中指定的位图(在我的情况下是mBitmap)联系起来,但实际上,在更新画布方面似乎不起作用。
谢谢, 保罗
2个回答

11
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)....

还要检查当缩放比大于1时,mScaled始终为true


哇,是的,那个链接的程序构建得几乎完全相同,除了我的问题是如何将位图绑定到画布上等。现在正在尝试这个解决方案。 - Unpossible

3

使用Bitmap.createScaledBitmap缩放位图,然后绘制无法正常工作。

解决方法是使用此函数(来自文档)缩放画布位图。

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

通过改变dst的大小,您的位图大小将发生改变。

以下是一个示例:如果我想在左上方绘制位图并将其缩放为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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接