2012-05-04 10 views
10

SurfaceViewを使用して、Android Appに大きな画像(通常は画面よりも大きいが、常にではない)を表示しています。これは非常に簡単なグラフィックスであり、OnTouchListenerまたはGestureDetectorを使用してスクロールを実装するのは簡単です。グラフィックスはレンダリングループで実行されますが、パフォーマンスはすべての実際のデバイスでは十分すぎるようです(しかし、エミュレータは少しでも苦痛になる可能性があります)。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

OK - 最終的には、実際にこれを長時間研究して研究する時間がありましたが、私は実際に問題を解決するソリューションを見つけました。

解決方法はBitmapRegionDecoder(API10 +)に依存します。これは、ビットマップ全体を一度に読み込むのではなく、ビットマップの一部にアプリケーションを読み込むことを可能にします。

ソリューションの本質:ビットマップ全体の

  1. ダウンサンプリングバージョンはメモリに保持されます。このバージョンはダウンサンプリングされているため、永久にそこに保持することができます。
  2. スレッドは、BitmapRegionDecoderを使用して、ビットマップの現在のビューポート(またはもう少し)をメモリに連続的にロードします。これは画面よりもわずかに大きいので、これもメモリに快適に収まるはずです。
  3. レンダリングスレッドは適切なバージョンをCanvasに描画します。すなわち、ズームアウトしている場合、またはビットマップが利用できない場合(たとえば、バックグラウンドでロードされているため)、ダウンサンプリングされたバージョンが使用されます。
  4. パン、フレーリング、ズームはジェスチャーリスナーで処理されます。

私が見つけたアイデアの最初の実装については、John Lombardo氏の功績によるものです。その現時点では実際のユーザーからの火の洗礼を持っていないので、

私はhttps://github.com/micabyte/android_game

で私の他のユーティリティクラスのいくつかと一緒に私の独自の実装をオープンソース化には、かなり最近の実装です。しかし、私は8000x4000ピクセルのビットマップを表示してテストを行いましたが、今まで問題はありませんでした。確かに、パフォーマンスは私の必要性にふさわしいようです。

+0

ITのlibプロジェクト – Dilip

0

ピンチとズームの実装は、ScaleGestureDetectorとCanvasインターフェイスを組み合わせて、変換マトリックスを使用して行うことです。スケール変換と翻訳の両方を扱うために同じ変換マトリックスを使用したいと思うでしょう。

関連する問題