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
}
私が抱えている問題は、マップをパンするたびに非常に奇妙な「ドリフト」動作があることです。一部の要素が遅延してレンダリングされ、新しい実際の場所ではなく、以前の場所に表示されるようです。
このビデオで現象を見ることができます -
何か自分のやり方が間違っていないか調べてみます。アイテムのレンダリングが遅すぎる原因となるような重いことだとは思えません。
これは、バックグラウンド スレッドが実行しているコードです。
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);
}
}
}
}
ありがとう!