2011-11-17 28 views
2

我知道這個問題已經反覆討論過了,但我找不到適合我需求的解決方案。在Android中使用大尺寸的可繪製和自定義視圖

場景:爲了保持簡單的解釋,我有一個自定義的視圖,其中顯示兩個圖像,一個是大背景,另一個是小圖像。用戶可以使用onTouch事件旋轉/縮放背景圖像。他還可以旋轉車輪圖像進行一些操作。一切都是在自定義的View不是SurfaceView上完成的,因爲我需要它是透明的。

問題:隨着onDraw()我總是需要檢查什麼旋轉/比例具有背景圖像,縮放/旋轉它,然後繪製它。如果背景圖像較小,比如說512x512的輪子圖像旋轉很好。如果背景圖像較大,1280x1707,輪子圖像旋轉是滯後的。所以我的猜測是,背景中的大圖像的操縱和旋轉,對於每個onDraw()都會給我帶來性能問題,當基本上只有用戶操縱它時才能重繪背景圖像。

輪換是在做事情,如:

canvas.save(); 
    float dx = (maxX + minX)/2; 
    float dy = (maxY + minY)/2; 
    drawable.setBounds((int) minX, (int) minY, (int) maxX, (int) maxY); 
    canvas.translate(dx, dy); 
    canvas.rotate(angle * 180.0f/(float) Math.PI); 
    canvas.translate(-dx, -dy); 
    drawable.draw(canvas); 
    canvas.restore(); 

可能的解決方案:我可以做一個新的自定義視圖可能只繪製背景圖片,並在它的上面,把我目前的查看和發送觸摸事件時,當我的背景圖像視圖。這將允許我只在需要時重新繪製背景圖像。任何其他想法?

+0

當你首先得到你的背景圖像時,你是否使用'ByteArray'解碼,或者它只是在你的/ res文件夾中,並且你將它設置爲可以繪製背景? – teoREtik

+0

我看到很多人在想要旋轉它時重新創建一個新的位圖,而不是設置用於將位圖繪製到畫布上的矩陣。如果你沒有這樣做,那就試試2張大小的圖像。這可能是該設備無法處理如此大的圖像,但顯示一些代碼,並讓我們有一個lookie。 – FunkTheMonk

+0

不,我只是想說,如果圖像的大小對於設備來說很大,那麼您可以使用解碼和「BitmapFactory.Options」對其進行優化。下面是一個很好的算法,它可以讓你優化你的應用程序性能:http://stackoverflow.com/questions/477572/android-strange-out-of-memory-issue/823966#823966 – teoREtik

回答

2

我有類似的性能問題,我找到的解決方案是我所描述的here。與您已經建議的類似,基本上背景只繪製一次,自定義ImageView處理其觸摸事件的所有轉換。

+0

可以請你提供一個簡單的示例代碼,因爲我不能完全理解工作流程。謝謝。 – Alin

+0

@Alin對不起,但我不能提供代碼,因爲它是專有軟件,但它基於架構示例我發佈在http://stackoverflow.com/questions/6792331/sluggish-zoom-and-scroll-with-在我自己的回覆中修改了gridview-in-android,以及我在這裏發佈的鏈接中描述的內容。如果還不清楚,請不要猶豫,讓我知道。 –

+0

我不確定我瞭解您的解決方案。我應該做一個自定義framelayout。 onSizeChange創建一個畫布,旋轉和縮放它,將其內容保存爲可繪製的位圖,然後將此位圖設置爲背景? – Alin

相關問題