我有一个绘图应用程序,允许用户绘制到一个空白画布。我正在尝试绘制当前位图的缩放“缩略图”,以便当用户在视图中缩放时,他们可以参考缩略图,以了解他们在整个绘图画布中的位置。我进行了缩放,并在正确的位置显示了缩略图,但在添加新的线条/形状时,缩略图似乎没有在后续的onDraws上更新。
为了访问该视图的底层位图(为了显示缩略图,能够轻松地将位图保存到文件等),我在视图的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),但实际上,就对画布的更新而言,它似乎不起作用。
谢谢,
保罗
发布于 2011-02-08 09:49:55
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是否始终为真
发布于 2016-11-30 17:27:35
按Bitmap.createScaledBitmap缩放位图,然后绘制将不起作用
缩放画布位图解决方案是使用此函数(从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因此,通过更改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);https://stackoverflow.com/questions/4925915
复制相似问题