gpt4 book ai didi

Android 缩放 Canvas 位图

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:28:47 25 4
gpt4 key购买 nike

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

这样我就可以访问该 View 的底层位图(显示缩略图,能够轻松地将位图保存到文件等),我在 onSizeChanged() 中为 View 执行以下操作:

@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);
}
}

缩略图显示在由 thumbnailRectF 使用 thumbCanvasPaint 定义的空间中,但在随后的 onDraw() 调用中,缩放位图并未从其原始状态改变,即使全尺寸 Activity Canvas 显示所有绘图,等。根据一些测试,在我看来,当我通过对 draw(mCanvas) 的初始调用设置位图时;,后续的 onDraws 正在写入底层位图,而不是在 onSizeChanged() 中指定的位图。

所以,我想我想弄清楚如何将 onDraw Canvas 绑定(bind)到位图,我可以轻松访问它来执行调整大小、保存等操作。查看 this question , 我认为 draw(mCanvas);调用会将 onDraw 绑定(bind)到 mCanvas 中指定的位图(在我的例子中是 mBitmap),但实际上,就 Canvas 的更新而言,它似乎不起作用。

谢谢,

保罗

最佳答案

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 是否始终为真

关于Android 缩放 Canvas 位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4925915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com