1

私は地図上にルートをプロットするためのシンプルなAndroidアプリに取り組んでいます。すべて順調ですが、SamsungGalaxyS2をズームインすると問題が発生します。Galaxy S3で正常に動作するので、スペックの低いデバイスのメモリ管理に関連しているかどうか疑問に思います。エミュレータでも正常に動作します。

これは、オーバーレイのonDrawメソッドにある同等のコードであり、ここに投稿するために要約されています。

Point current = new Point();
Path path = new Path();
Projection projection = mapView.getProjection();

Iterator<GeoPoint> iterator = pointList.iterator();
if (iterator.hasNext()) {
    projection.toPixels(iterator.next(), current);
    path.moveTo((float) current.x, (float) current.y);
} else return path;
while(iterator.hasNext()) {
    projection.toPixels(iterator.next(), current);
    path.lineTo((float) current.x, (float) current.y);
}

Paint roadPaint = new Paint();
roadPaint.setAntiAlias(true);
roadPaint.setStrokeWidth(8.0f);
roadPaint.setColor(Color.BLACK);
roadPaint.setStyle(Paint.Style.STROKE);

canvas.drawPath(path, roadPaint);

これを行うために浮かんでいるサンプルコードのほとんどとそれほど異ならない。誰かが私の疑いを確認し、すべてのズームレベルで強制的に描画するためにできる構成や微調整に関して私ができることがあるかどうかアドバイスできるかどうか疑問に思っていますか?

前もって感謝します。

乾杯、ネイサン

4

2 に答える 2

1

問題は、マップビューの非常に特定の状態に対してオーバーレイを自分でペイントしていることです。代わりにOverlayItemを使用する必要があります。

OverlayItem が MapView オーバーレイ コレクションに追加され、MapView は自身の状態 (ズーム、場所など) に応じてすべての再描画を処理します。

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

    int x1 = -1;
    int y1 = -1;
    int x2 = -1;
    int y2 = -1;

    Paint paint = new Paint();
    paint.setStyle( Paint.Style.STROKE );
    paint.setColor( GeoLocation.ROUTE_COLOR );
    paint.setStrokeWidth( STROKE_WIDTH );

    for ( int i = 0; i < mRouteGeoPoints.size(); i++ )
    {
        Point point = new Point();
        mapView.getProjection().toPixels( geoPoints.get( i ), point );
        x2 = point.x;
        y2 = point.y;
        if ( i > 0 )
        {
            canvas.drawLine( x1, y1, x2, y2, paint );
        }
        x1 = x2;
        y1 = y2;
    }
}
于 2012-11-22T13:33:55.303 に答える
0

上記のコードは同等のものであり(実行している実際のコードではありません)、Pathオブジェクトを返すonDraw()ことができなかったので、それは明らかです。

表示するコードの「圧縮形式」は、drawLine(). したがって、問題は別のものから発生するはずです (元のコードの可能性があります)。

とにかく、私はあなたにいくつかのヒントを与えます:

  • キャンバスに描画しているオブジェクトの上部と下部が両方とも画面外にある場合、そのオブジェクトは無視され、描画されません。これがあなたのパスで起こっていることではないかどうかを確認してください。この投稿で私の回答を参照してくださいAndroidマップオーバーレイがZoomで消える
  • パス オブジェクトを毎回再構築する必要はありません。あなたはおそらくすでにそれを行っているので、上記の短いバージョンを作成したのはそのためです。パスの描画を改善するためのいくつかの提案を含むこの投稿の私の回答を参照してください:ズーム時のオーバーレイ動作
  • 何らかの理由で のより遅いアプローチを本当に使用したい場合はdrawLine()、次の方法を使用して線の見栄えを良くすることができます。

    paint = new Paint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setColor(...);
    paint.setAlpha(...);
    paint.setStrokeWidth(...);
    

最後に、問題が解決しない場合は、より関連性の高いコードで質問を更新してお知らせください。多分私はさらに助けることができます。

よろしく。

于 2012-11-23T01:02:48.237 に答える