3

私のアプリは大きな画像(家の間取り図)を読み込んでから、その画像にタッチ反応性のオブジェクト(家具、ランプなど)を描画しています。アプリにベースイメージファイルが含まれていますが、オブジェクトはデータベースの座標から取得されます。

アプリを複数の反復で正常にデプロイしましたが、より大きなベースイメージを使用する必要があり、多くのデバイスで例外BitmapFactoryが発生OutOfMemoryしています(古いデバイスと新しいデバイスの両方。ヒープが32MB未満のものはクラッシュするようです)。SOに関する157のOOMの質問を読みましたが、解像度/ズームはアプリの機能にとって重要であるため、それらすべてが指していると思われる リンクは役に立たないのではないかと思います。

ロードする前にデバイスの使用可能なメモリをテストしようとしましたが、結果はせいぜいむらがあります(Galaxy S3などの一部のデバイスは大量のヒープを報告しますが、それでもクラッシュします)。解像度を下げてみましたが、上記のテストで安全なサイズに縮小すると画像が使えなくなりました。

ビットマップを使用せずにこのデザインを実装する別の方法はありますか?する必要がある:

  • 大きなベースイメージをロードする
  • ベース画像の上にクリック可能な形状を作成し、ベース画像に対する位置/スケールを維持します
  • ボーナス:iOSバージョンのアプリでは、SVGスタイルのテキストスケーリングを実行できるため、小さなオブジェクトの長いラベルは、マップ上を走る代わりにオブジェクト内に留まります(画像がズームされるまで表示されません)。これをAndroidで複製すると、私は幸せなコードモンキーになります。

必要に応じてコードを投稿できますが、皆さんは以前にそれを見たことがあります(ほとんどすべてがSOからのものです)。

読んでくれて、そしてあなたが与えることができるどんな助けにも前もって感謝します。

4

4 に答える 4

3

いくつかのオプションがあります:

  1. コメントが示すように、大きな画像をタイルに分割し、これらのタイルを配列にロードし、カメラオブジェクトを移動して、描画する必要のあるタイルのみをロードします。

  2. 画像を小さくし、「android:scaletype」を使用して拡大します

  3. Canvas実行時にオブジェクトに線と曲線を描画します。

  4. OpenGLを使用する

適切な解決策は、実際にどのように表示するかによって異なります。タイリングはより多くの開発努力を要しますが、見栄えが良くなります。描画されていないタイルを適切にクリーンアップしていることに注意してください...

動的なスケーリングは簡単になりますが、画像がぼやけないことを保証することはできません。

実行時にオブジェクトに描画するとCanvasうまくいく可能性があります。幅や円、長方形などが異なる線を使用するだけです。

OpenGLを使用すると、学習曲線が最も急になり、やり過ぎになる可能性があります。これはあなたの目的に依存します。

于 2012-12-06T16:57:02.107 に答える
0

「largeHeap」の使用を検討することをお勧めし ますhttp://developer.android.com/reference/android/R.styleable.html#AndroidManifestApplication_largeHeap

于 2012-12-14T03:11:57.807 に答える
0

ここにいくつかのオプションがあります:

1)タイルを使用します。タイルを使用して、データを動的にロードします。正直なところ、これが最善の解決策です。このソリューションを使用すると、任意の大きな画像をロードできます。

私はこのアプローチを無限のペイントキャンバスにうまく使用しましたが、非常にうまく機能します。実際には、ユーザーに直接表示されるものを描画するだけで済みます。タイルは、不要な部分を捨てる方法です。タイルのピラミッド(画像を事前にダウンサンプリングしてさらにタイルを作成する場所)を使用すると、これをクリーンで高速な方法で実行できます。

2)ネイティブコードを使用します。ネイティブコードのメモリ制限は、Javaコードと同じではありません。より多くのメモリを割り当てることで逃げることができます。

3)OpenGLを使用します。繰り返しになりますが、OpenGLのメモリ制限はJavaコードと同じではありません。

4)元の計画をSVGに変換し、このようなSVGライブラリを使用します。

5)「largeHeap」を使用します。largeHeapが解決策になることはめったにないと思うので、これは強くお勧めしません。一般的に、問題に取り組むためのよりクリーンな方法があります。

于 2012-12-14T03:27:24.097 に答える
0

画像が静的な場合は、次の優れたライブラリを使用することをお勧めします。

https://github.com/ManuelPeinado/ImageLayout

ライブラリが画像の自動ダウンサンプリングをサポートしていない場合は、現在のデバイスに最適な画像を使用するために、自分で行う必要があります(OOMが取得されないようにするため)。

テキストの自動サイズ変更については、次の投稿で多少の問題が発生する可能性があります。

Android用TextViewの自動調整

于 2013-07-24T07:42:14.207 に答える