2011-02-07 124 views
5

我有一個繪圖應用程序,允許用戶繪製到空白畫布。我試圖繪製當前位圖的縮放「縮略圖」,以便當用戶在視圖中縮放時,他們可以引用縮略圖以瞭解它們在整個繪製畫布中的位置。我的縮放工作正常,並且正在將縮略圖顯示在正確的位置,但是當添加新的線條/形狀時,縮略圖似乎並未在後續的onDraw中更新。Android縮放畫布位圖

所以,我有機會獲得潛在的位圖這個觀點(顯示縮略圖,可以很容易地將位圖保存到文件等)我在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); 
} 

然後,當用戶繪製和無效()被調用時,我做的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()調用中,縮放的位圖具有沒有改變它的原始狀態,即使全尺寸的活動畫布顯示了所有的繪圖等。基於一些測試,在我看來,雖然我設置了初始調用畫圖(mCanvas)的位圖,後續onDraws正在寫入底層位圖,而不是在onSizeChanged()中指定的位圖。

因此,我想我想知道如何將onDraw畫布綁定到位圖,以便讀取執行重新大小,保存等操作。查看this question,我認爲draw(mCanvas) ;調用會將onDraw綁定到mCanvas中指定的位圖(在我的例子中是mBitmap),但實際上,就更新畫布而言,它似乎不起作用。

感謝,

保羅

回答

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

還要檢查mScaled是真實的一切,當時間變焦是灰色的亞特大於1

+0

我可以看到你的解決方案whith這個例子的相似性:http://www.barebonescoder.com/2010/06/android-development-simple-2d-graphics-part-1/ – Lumis 2011-02-08 02:06:00

0

量表位圖由Bitmap.createScaledBitmap然後繪製不會那麼通過改變dst大小工作

用於規模將溶液在畫布位圖是使用此函數(從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 

,你的位圖大小將改變

這裏是一個例子,如果我想繪製一個位圖在左上方並將其縮放到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);