2012-08-01 60 views
1

我在MapView上实现了路由的自定义路径效果,并提出了如何使路径四舍五入的开始和结束的问题(如Paint.setStrokeCap(Cap.ROUND))。见截图 - 黑线 - 是我的路我要舍末自定义PathEffect的笔画上限

这里是我如何实现我的自定义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()到我的路径的结尾(和开始),但这看起来不正确。

我需要自定义路径效果的原因是我需要在实际道路上绘制路线 - 因此路线应该是空的,并且具有内部和外部的线条。

如果有人知道如何使这种路径效应在一些其他的方式 - 请让我知道,因为这种解决方案具有很大的缺点我不得不面对..

No stroke cap

回答

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 
} 

所以结果是这样的:

enter image description here

2

我不除非你遇到这里提到的问题http://code.google.com/p/android/issues/detail?id=24873,否则看不到任何理由。

+0

我指定自定义路径线,让Android不知道,在盖子应该是什么,应该如何看起来像我的自定义路径线。那就是为什么我认为中风帽不起作用。 – 2012-08-01 04:29:35