0

Android の SurfaceView と Canvas を使用して、ある種のベクター マップを実装しました。マップの各要素は、各パスをキャンバスに描画する for ループで描画されるパスによって表されます。

このようなもの -

void doDraw(Canvas canvas)
        {
        canvas.drawColor(Color.WHITE);

        if (mMapModel == null)
            return;

        for (MapElement e : mMapModel.getMapElements()){
            Path[] drawing = e.getDraw();
            canvas.drawPath(drawing[0], mPathFramePaint);   //draw the frame
            mPathFillPaint.setColor(e.color);
            canvas.drawPath(drawing[1], mPathFillPaint);    //draw the fill
}

私が抱えている問題は、マップをパンするたびに非常に奇妙な「ドリフト」動作があることです。一部の要素が遅延してレンダリングされ、新しい実際の場所ではなく、以前の場所に表示されるようです。

このビデオで現象を見ることができます -

YouTube のビデオ

何か自分のやり方が間違っていないか調べてみます。アイテムのレンダリングが遅すぎる原因となるような重いことだとは思えません。

これは、バックグラウンド スレッドが実行しているコードです。

public class MapViewThread extends Thread

{

    boolean mRun;

    Canvas mcanvas;

    SurfaceHolder surfaceHolder;

    Context context;

    MapView mMapView;



    public MapViewThread(SurfaceHolder sholder, Context ctx, MapView mapView)
    {
        surfaceHolder = sholder;

        context = ctx;

        mRun = false;

        mMapView = mapView;

    }

    void setRunning(boolean bRun)
    {
        mRun = bRun;
    }


    @Override
    public void run()
    {
        super.run();
        while(mRun)
        {
            mcanvas = surfaceHolder.lockCanvas();
            if(mcanvas != null) 
            {
                mMapView.doDraw(mcanvas);

                surfaceHolder.unlockCanvasAndPost(mcanvas);
            }
        }
    }
}

ありがとう!

4

1 に答える 1

0

最後にそれを解決しました。それはスレッドの問題でした!

各パンで、パスの大きなリストを繰り返し処理し、各パスの座標を更新しています。

リスト内の各アイテムの位置の更新を完了する前に、レンダリング スレッドがパスをレンダリングしていました。

いくつかの同期を使用して、2 つのスレッド間でこれを解決できました。

于 2013-03-10T18:46:42.877 に答える