首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用边界画出一条道路?

如何用边界画出一条道路?
EN

Stack Overflow用户
提问于 2013-10-31 16:14:49
回答 2查看 7.3K关注 0票数 1

我想画一条类似于图像的路径。它有两个黑色边框,里面是白色的,而不是透明的。如何实现这一目标?尤其是关节位置。

EN

Stack Overflow用户

回答已采纳

发布于 2013-11-04 02:11:44

要获得所需的结果,您必须将路径绘制成几个部分。

您将用两个不同的Paint对象绘制两次部分,仅在笔画宽度和颜色上有所不同。绘制每个部分后,路径将被重置。代码注释应该解释其馀部分:

代码语言:javascript
运行
复制
public class SView extends View {

    Path path;
    Paint paint, paintWhite;
    RectF rf, rf2, rf3;

    public SView(Context context) {
        super(context);

        path = new Path();

        // 'paint' has a wider stroke-width 
        // compared to 'paintWhite' and 
        // thus becomes the border paint
        paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(15);
        paint.setStyle(Style.STROKE);

        // 'paintWhite' colors the inner path
        paintWhite = new Paint();
        paintWhite.setColor(Color.WHITE);
        paintWhite.setAntiAlias(true);
        paintWhite.setStrokeWidth(12);
        paintWhite.setStyle(Style.STROKE);

        // For this example, we'll draw three
        // arcs bound by the following RectF
        // objects
        rf = new RectF(200, 200, 500, 500);
        rf2 = new RectF(200, 200, 400, 500);
        rf3 = new RectF(100, 200, 400, 500);                    
    }

    @Override
    protected void onDraw(Canvas canvas) {          

        // First arc bound by 'rf'
        path.arcTo(rf, 0, 180);

        // Draw 'path' using 'paint' 
        // and then, again using 'paintWhite'       
        canvas.drawPath(path, paint);
        canvas.drawPath(path, paintWhite);

        // Reset 'path' so as to clear 
        // history
        path.reset();

        // Repeat with the rest of arcs
        path.arcTo(rf2, 180, 180);      
        canvas.drawPath(path, paint);
        canvas.drawPath(path, paintWhite);      
        path.reset();           

        path.arcTo(rf3, 0, 180);            
        canvas.drawPath(path, paint);
        canvas.drawPath(path, paintWhite);  

    }       
}

输出:

注意:重叠的弧由RectF rf3绑定,最后绘制。

由于我们将white部分与borders一起绘制,所以您将不会以四路交叉结束。这些部件将以一种flyover的方式重叠:按照绘制的顺序。

为了提高性能(我想),您可以在重置路径之前检查路径的下一部分是否与前面的部分相交。如果下一部分是相交的,则重置和绘制两个画图对象的部分。如果没有,只需将该部分附加到路径并等待到下一个交叉口绘制它。当然,您需要维护绘制的部件的历史记录(在上面的示例中,历史记录将包含边界:'RectF‘对象)。然而,我并不是百分之百确定这是否比反复重置路径,然后绘制部分更好。

票数 23
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19711616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档