1

MapViewの上にルートのカスタムパス効果を実装していますが、パスの開始と終了を丸める方法(のように)の問題を思いつきましたPaint.setStrokeCap(Cap.ROUND)。スクリーンショットを参照してください-黒い線-最後に丸めたい私のルートです

カスタムPathEffectを実装した方法は次のとおりです。

public RouteOverlay(Context context)
{
    mContext = context;

    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setColor(COLOR_DEFAULT);
    mPaint.setAntiAlias(true);
    mPaint.setStrokeCap(Cap.ROUND); // this one does not work...
    mPaint.setStrokeJoin(Join.ROUND);
    PathEffect e1 = new PathDashPathEffect(createRouteLineStyle(), 10, 3, PathDashPathEffect.Style.MORPH);
    PathEffect e2 = new CornerPathEffect(10);
    mPaint.setPathEffect(new ComposePathEffect(e1, e2));
}

private Path createRouteLineStyle() 
{
    Path p = new Path();
    p.moveTo(-5, ROUTE_LINE_WIDTH/2);
    p.lineTo(5,ROUTE_LINE_WIDTH/2);
    p.lineTo(5,ROUTE_LINE_WIDTH/2-currentThickness);
    p.lineTo(-5, ROUTE_LINE_WIDTH/2-currentThickness);
    p.close();
    p.moveTo(-5, -(ROUTE_LINE_WIDTH/2));
    p.lineTo(5,-(ROUTE_LINE_WIDTH/2));
    p.lineTo(5, -(ROUTE_LINE_WIDTH/2-currentThickness));
    p.lineTo(-5, -(ROUTE_LINE_WIDTH/2-currentThickness));
    return p;
}

@Override
public void draw(Canvas canvas, final MapView mapView, boolean shadow)
{
    if(shadow) return;

    if(mDrawEnabled)
    {
        synchronized(mPoints)
        {
            canvas.drawPath(mPath, mPaint);
        }
    }
}

スクリーンショットでわかるように、行の終わりは丸められていません(開始も同様です...)。setStrokeCap(Cap.ROUND)助けにはなりません。

だから問題は-私のカスタムパスにラウンドキャップを追加する方法は?私は自分の道を使うaddArc()addCircle()、最後まで(そして最初まで)考えていましたが、これは正しくないようです。

カスタムパス効果が必要な理由は、実際の道路の周りにルートを描画する必要があるためです。そのため、ルートは内側が空で、内側と外側のストロークラインが必要です。

誰かがこの種のパス効果を他の方法で作成する方法を知っている場合-このソリューションには私が対処しなければならない大きな短所があるので、私に知らせてください。

ストロークキャップなし

4

2 に答える 2

2

ここに記載されている問題が発生しない限り、それが機能しない理由はわかりませんhttp://code.google.com/p/android/issues/detail?id=24873

于 2012-08-01T02:25:50.523 に答える
2

私は自分の問題の解決策を見つけることができました。そこで、カスタムパス効果を取り除き、通常のストローク(ストロークキャップが期待どおりに機能する場合)を使用し始めました。したがって、基本的に2回パスを描画します。最初は黒い線を描画し、その後、前の黒い線の中心をクリアするために細い透明な線を描画します。

このアプローチの唯一の秘訣は、パスを別のビットマップに描画する必要があり(一時キャンバスを使用)、パスビットマップの準備ができたらメインキャンバスにレンダリングすることです。

@Override
public void draw(Canvas canvas, final MapView mapView, boolean shadow)
{
    //Generate new bitmap if old bitmap doesn't equal to the screen size (f.i. when screen orientation changes)
    if(pathBitmap == null || pathBitmap.isRecycled() || pathBitmap.getWidth()!=canvas.getWidth() || pathBitmap.getHeight()!=canvas.getHeight())
    {
        if(pathBitmap != null)
        {        
            pathBitmap.recycle();
        }
        pathBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Config.ARGB_8888);
        tempCanvas.setBitmap(pathBitmap);
    }

    //Render routes to the temporary bitmap
    renderPathBitmap();

    //Render temporary bitmap onto main canvas
    canvas.drawBitmap(pathBitmap, 0, 0, null);
    }
}

private void renderPath(Path path, Canvas canvas)
{
    routePaint.setStrokeWidth(ROUTE_LINE_WIDTH);
    routePaint.setColor(OUTER_COLOR);
    routePaint.setXfermode(null);

    canvas.drawPath(path, routePaint); //render outer line

    routePaint.setStrokeWidth(ROUTE_LINE_WIDTH/1.7f);
    routePaint.setColor(Color.TRANSPARENT);
    routePaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));

    canvas.drawPath(path, routePaint); //render inner line
}

したがって、結果は次のようになります。

ここに画像の説明を入力してください

于 2012-08-16T18:06:57.163 に答える