14

Androidでシングルタップ方式でマーカーを描画しようとしています。マーカーを描画すると描画されますが、描画に時間がかかります。つまり、30〜40ミリ秒かかり、2〜3秒かかる場合があります。これは、描画メソッドを持つクラスのコードです。

public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {

    private ArrayList<OverlayItem> overlayItemList = new ArrayList<OverlayItem>();

    public MyItemizedOverlay(Drawable pDefaultMarker,
            ResourceProxy pResourceProxy) {
        super(pDefaultMarker, pResourceProxy);
    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean arg2) {
        super.draw(canvas, mapView, arg2);

        // ---translate the GeoPoint to screen pixels---
        Point screenPts = new Point();
        mapView.getProjection().toPixels(p, screenPts);

        // ---add the marker---
        Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                R.drawable.pin_annotation_darkblue);
        Bitmap bmp1 = BitmapFactory.decodeResource(getResources(),
                R.drawable.pin_annotation_green);
        Bitmap bmp2 = BitmapFactory.decodeResource(getResources(),
                R.drawable.pin_annotation_bue);
        Bitmap bmp3 = BitmapFactory.decodeResource(getResources(),
                R.drawable.pin_annotation_light);
        Bitmap bmp4 = BitmapFactory.decodeResource(getResources(),
                R.drawable.pin_annotation_light);
        Bitmap bmp5 = BitmapFactory.decodeResource(getResources(),
                R.drawable.pin_annotation_light);
        Bitmap bmp6 = BitmapFactory.decodeResource(getResources(),
                R.drawable.pin_annotation_light);
        if (count == 1) {
            int caller = getIntent().getIntExtra("button", 0);
            switch (caller) {
            case R.id.btMap:
                canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
                bmp.recycle();
                break;
            case R.id.imageButton1:
                canvas.drawBitmap(bmp1, screenPts.x, screenPts.y - 50, null);
                bmp1.recycle();
                break;
            case R.id.imageButton2:
                canvas.drawBitmap(bmp2, screenPts.x, screenPts.y - 50, null);
                bmp2.recycle();
                break;
            case R.id.imageButton3:
                canvas.drawBitmap(bmp3, screenPts.x, screenPts.y - 50, null);
                bmp3.recycle();
                break;
            case R.id.imageButton4:
                canvas.drawBitmap(bmp4, screenPts.x, screenPts.y - 50, null);
                bmp4.recycle();
                break;
            case R.id.imageButton5:
                canvas.drawBitmap(bmp5, screenPts.x, screenPts.y - 50, null);
                bmp5.recycle();
                break;
            case R.id.imageButton6:
                canvas.drawBitmap(bmp6, screenPts.x, screenPts.y - 50, null);
                bmp6.recycle();
                break;
            }
        }
        // Bitmap bmp = BitmapFactory.decodeResource(getResources(),
        // R.drawable.pin_annotation_green);
        // if (count == 1) {
        // canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
        // }
}
4

3 に答える 3

8

コードを最適化するためのアイデアは、描画に必要な操作のみを実行することです。したがって、 onDraw メソッドから削除する必要があります。

  • 任意のインスタンス化: 時間がかかり、onDraw が頻繁に呼び出され、新しいオブジェクトをあまり作成したくない場合。onLayout 中に screenPts を保存し、常に同じポイントを再利用します。
  • BitmapFactory.decodeResource : これにはかなりの時間がかかります。最初にビットマップをデコードして保存し、onDraw 中にのみ描画します。
  • ビットマップを描画するたびにではなく、不要になったときにビットマップをリサイクルします。

例えば ​​:

  • onResume 中にビットマップをデコードする
  • onPause 中にそれらをリサイクルする
  • 非同期タスク内でデコードを行う必要があります。非同期タスクが終了したら、フラグを立てて、画像の準備ができて描画できることを onDraw に示します。
  • 時間がかかるため、バックグラウンドで画像をデコードすることは非常に重要です。メイン UI スレッドではこれを行わないでください。そうしないと、アプリが応答していないように見えます
  • onLayout 内で screenPts を計算し、常に同じポイントを再利用します。
  • onDraw 中も getIntent を呼び出さないでください。

簡単に言えば、onDraw 中の操作を最小限に抑えると、約 60 FPS という非常に高速な描画が実現します。

また、その(醜い)スイッチを削除することを検討し、ハッシュマップを使用してカウントの値と描画するビットマップを関連付ける必要があります。配列はさらに高速で、ここではより適切かもしれません。

于 2013-10-28T06:25:45.433 に答える
2

メソッドからすべてのBitmapFactory.decodeResource()呼び出しを削除する必要がありますdraw()。ビットマップを一度だけデコードし、それへの参照を保持します。次に、メソッドを呼び出しcanvas.drawBitmap()ますdraw()

于 2013-10-28T06:24:22.000 に答える