首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Scaling Canvas位图

Android Scaling Canvas位图
EN

Stack Overflow用户
提问于 2011-02-08 04:03:12
回答 2查看 24K关注 0票数 8

我有一个绘图应用程序,允许用户绘制到一个空白画布。我正在尝试绘制当前位图的缩放“缩略图”,以便当用户在视图中缩放时,他们可以参考缩略图,以了解他们在整个绘图画布中的位置。我进行了缩放,并在正确的位置显示了缩略图,但在添加新的线条/形状时,缩略图似乎没有在后续的onDraws上更新。

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

代码语言:javascript
复制
@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()中执行以下操作以生成缩略图:

代码语言:javascript
复制
@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),但实际上,就对画布的更新而言,它似乎不起作用。

谢谢,

保罗

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-08 09:49:55

代码语言:javascript
复制
canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 

应更改为

代码语言:javascript
复制
canvas.drawBitmap(out, new Rect(0,0,mBitmap.getWidht, mBitmap.getheight), thumbnailRectF, thumbCanvasPaint);

不需要

代码语言:javascript
复制
Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int)....

另外,当缩放比大于1时,还要检查mScaled是否始终为真

票数 9
EN

Stack Overflow用户

发布于 2016-11-30 17:27:35

Bitmap.createScaledBitmap缩放位图,然后绘制将不起作用

缩放画布位图解决方案是使用此函数(从docs

代码语言:javascript
复制
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的示例

代码语言:javascript
复制
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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4925915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档