我有一个绘图应用程序,允许用户绘制到空白画布。我正在尝试绘制当前位图的缩放“缩略图”,以便当用户在视图中缩放时,他们可以引用缩略图以了解它们在整个绘制画布中的位置。我有缩放工作,并在正确的位置显示缩略图,但是当添加新的线条/形状时,似乎在后续的onDraw上没有更新缩略图。
这样我就可以访问此视图的基础位图(显示缩略图,能够轻松地将位图保存到文件中等)。我在视图的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);的初始调用设置Bitmap时,后续的onDraws正在写入底层的Bitmap而不是onSizeChanged()中指定的位图。
所以,我想我想弄清楚我是如何将onDraw画布绑定到一个Bitmap,我可以阅读它来执行重新调整大小,保存等等。看着this question,我认为画了(mCanvas); call会将onDraw绑定到mCanvas中指定的位图(在我的例子中是mBitmap),但实际上,就canvas的更新而言,它似乎不起作用。
谢谢,
保
答案 0 :(得分:7)
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是否为真
答案 1 :(得分:0)
按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);