2012-05-04 95 views
10

我正在使用SurfaceView在Android應用程序中顯示大圖像(通常比屏幕更大,但並非總是)。這是非常簡單的圖形,使用OnTouchListener或GestureDetector實現滾動很容易。圖形在Render循環中運行,但是對於所有真實設備來說性能似乎已經足夠了(儘管如此,模擬器可能有點痛苦)。在Android上實現捏和縮放SurfaceView

我正在考慮在圖像上實施捏和縮放,但是我寧願避免去OpenGL,因爲我對OpenGL的經驗很少,使用OpenGL看起來像是一件很簡單的事情, 。

看起來好像android.graphics.Camera類可能允許我實現我想要的縮放功能。

有誰知道任何一個很好的例子,顯示在基本的Android SurfaceView上執行捏縮放功能嗎?

另外,如果你已經實現了這樣的東西,對性能有什麼想法?考慮到這裏需要的是如此簡單,OpenGL是否值得額外的麻煩?


是問題不清楚這裏,還是我失去了對Android開發者網站,我應該已經發現了一些令人眼花繚亂明顯文檔/代碼?

+0

我也在尋找這樣的東西。你有沒有得到解決方案。你能分享一下嗎? – Nir

+0

不幸的是,沒有什麼,我真的很開心。當然可以使用「暴力破解」(使用GestureDetector),但這不是一個很好的解決方案,並且會非常耗費內存。 –

+0

嗯...看看這個教程:http://blahti.wordpress.com/2013/01/07/pan-zoom-examples-for-android/我還沒有檢查出來,但只是基於快速瀏覽,它看起來很有希望。 –

回答

3

好的 - 終於有時間真的在這段時間裏工作和研究了一段時間,我實際上找到了一個解決方案來解決我所遇到的問題。

該解決方案依賴於BitmapRegionDecoder(API10 +)。這樣做可以讓應用程序加載位圖的一部分,而不是一次嘗試加載整個位圖。

溶液的本質:

  1. 下采樣的整個位圖的版本被保持在存儲器中。由於這個版本是下采樣,它可以永久保存在那裏。
  2. 線程將當前視口(或更多)的位圖連續加載到內存(使用BitmapRegionDecoder)。由於這個尺寸至多比屏幕稍大,所以它也應該適合記憶。
  3. 渲染線程將相應的版本繪製到畫布;即如果縮小或位圖不可用(例如,因爲它在後臺加載),則使用下采樣版本。
  4. Pan,Fling和Zoom由GestureListeners處理。

對於我發現的創意的第一個實現,我們得到John Lombardo的信任。

我在https://github.com/micabyte/android_game

開源我自己的實現我的一些其他實用工具類的沿着這是一個相當最近實施,所以它不會在這個時候有火從真實用戶的洗禮。但是,我已經運行了顯示8000x4000像素位圖的測試,目前沒有問題。性能當然似乎足以滿足我的需求。

+0

IT的自由項目 – Dilip

0

實現捏合和縮放是您將ScaleGestureDetector和Canvas接口與變換矩陣結合使用的功能。您需要使用相同的轉換矩陣來處理縮放和翻譯。