0

コンサートホールの小さな地図をアプリに実装する必要があります。POIが表示されます。ズームしたり、移動したりできる必要があります。

Pictureに変換されたsvgファイルで動作するクラスを実行しました。ImageViewを拡張してonDrawを上書きしました。

しかし今、私は1.2Meg pngで同じことをしなければならず、私が得るのはメモリエラーだけです。

私が使うBitmapFactory.decodeResource, and then canvas.drawBitmap(bm, canvas.getMatrix(),null)

誰かがそうするためのチュートリアルをどこかに持っていますか、それとも私の方法の何が問題なのかを教えてくれますか?

ありがとう !

ルノー

4

1 に答える 1

1

PNGファイルはディスク上で1.2MBを占有しますが、メモリ内でRGBビットマップにデコードされます。これははるかに大きくなります。たとえば、800x600ピクセルの24ビットRGBビットマップは1.4MBをわずかに下回るメモリを消費しますが、PNGに圧縮すると30kBまで小さくなる可能性があります。

解決策は、現在画面に表示されているマップのサブセクションのみをレンダリングすることです。

これを簡単にするために、ソース画像を画面のちょうど1/4のサイズのチャンクに分割することができます。これにより、常に、これらの小さい画像が9つ以下メモリに読み込まれるようになります。

+--+----------+--------+
|1 |    2     |   3    |
+--+----------+--------+
|  |          |        |
|4 |    5     |   6    |
|  |          |        |
|  |          |        |
+--+----------+--------+
|  |          |        |
|7 |    8     |   9    |
|  |          |        |
+--+----------+--------+

画像が完全に整列している場合、メモリに必要な画像は4つだけです。スクロールしながら最適化するために、スクロール方向に画像をプリフェッチできます。

マップが10000x10000ピクセルで、画面が480x800の場合は、画像のエッジを拡大して、画像を均等に分割できるように、しばらくの間または黒(または任意の背景色!)のエッジにします。この場合、10080x10400を使用します。

于 2012-06-26T09:50:41.220 に答える