あなたはすでに答えを受け入れていますが、ここに私がこれに使用するアプローチがあります。以下のサンプルコードでは、古いものを使用してMapView
いますが、この概念はどのバージョンでも機能するはずです。私もmapforges
(最小限の調整で)それを使用しています。
コンセプト
path
最初の呼び出しであなたを構築しdraw()
、point(0)の位置を記録します
- 次に
draw()
、point(0)の位置が変更された場合、マップは移動しました。描画する前に、「パス」を同じ値でオフセットします。
- ズームが変更された場合は、
path
オブジェクトを再作成します。
パフォーマンス
中距離デバイスに10.000ポイントのパスがある場合、2 ms
キャッシュされたdraw()
呼び出しごとに約かかります。パスを再構築する必要がある場合(ズームを変更した場合)、約80 ms
。
もちろん、さまざまなパスズームレベルをキャッシュして、メモリを増やすことでパフォーマンスを少し向上させることもできます。
サンプルコード
draw()メソッドは、ズームの変更があるかどうか(ある場合はパスを再構築するように依頼する)、およびマップが移動したかどうか(ある場合はオフセットパス)のみをチェックし、最後にパスを描画します。
@Override
public void draw(Canvas canvas, MapView mapview, boolean shadow) {
super.draw(canvas, mapview, shadow);
if(shadow) return;
if(mp.getPoints() == null || mp.getPoints().size() < 2) return;
Projection projection = mapview.getProjection();
int lonSpanNew = projection.fromPixels(0,mapview.getHeight()/2).getLongitudeE6() -
projection.fromPixels(mapview.getWidth(),mapview.getHeight()/2).getLongitudeE6();
if(lonSpanNew != pathInitialLonSpan)
pathBuild();
else{ //check if path need to be offset
projection.toPixels(mp.getPoints().get(0), p1);
if(p1.x != pathInitialPoint.x || p1.y != pathInitialPoint.y){
path.offset(p1.x - pathInitialPoint.x, p1.y - pathInitialPoint.y);
pathInitialPoint.x = p1.x;
pathInitialPoint.y = p1.y;
}
}
canvas.drawPath(path, paint);
}
ズームが変更されるたびにパスを作成する必要があります。getZoomLevel()はマップズームアニメーションと同期していないため、ズーム変更の検出はpathInitialLonSpanを使用して行われます。
private void pathBuild(){
path.rewind();
if(mp.getPoints() == null || mp.getPoints().size() < 2) return;
Projection projection = mapView.getProjection();
pathInitialLonSpan = projection.fromPixels(0,mapView.getHeight()/2).getLongitudeE6() -
projection.fromPixels(mapView.getWidth(),mapView.getHeight()/2).getLongitudeE6();
projection.toPixels(mp.getPoints().get(0), pathInitialPoint);
path.moveTo(pathInitialPoint.x,pathInitialPoint.y);
for(int i=1; i<mp.getPoints().size(); i++){
projection.toPixels(mp.getPoints().get(i), p1);
int distance2 = (pPrev.x - p1.x) * (pPrev.x - p1.x) + (pPrev.y - p1.y) * (pPrev.y - p1.y);
if(distance2 > 9){
path.lineTo(p1.x,p1.y);
pPrev.set(p1.x, p1.y);
}
}
よろしく。