【问题标题】:How to fill outside of a drawing on canvas如何在画布上的绘图之外填充
【发布时间】:2015-07-28 11:08:03
【问题描述】:

对于画布上的一些画线,我想用颜色填充它。到目前为止,我所到之处如下:

int height = getMeasuredHeight();
int width = getMeasuredWidth();
canvas.drawRect(0,0,width, height, mBackgroundPaint);
for(ArrayList<PointF> arc : drawings) {
    Iterator<PointF> iter = arc.iterator();
    Path tempPath = new Path();
    PointF p = iter.next();
    tempPath.moveTo(p.x, p.y);
    while (iter.hasNext()) {
        PointF l = iter.next();
        tempPath.quadTo(p.x, p.y, l.x, l.y);
        p = l;
    }
    tempPath.lineTo(p.x, p.y);
    canvas.drawPath(tempPath, paint);
}

在这段代码中,正在绘制 Arraylist 中的一些自定义绘制。它由tempPath 绘制。通过绘制一个填充的矩形来填充背景颜色。这里的问题是如果tempPath 被绘制并用颜色transparent 填充,则会显示背景颜色。我想从背景矩形中排除tempPath 中的点。

感谢您的帮助

【问题讨论】:

  • 不知道你的问题是否正确,不就是paint.setStyle(Style.FILL_AND_STROKE);吗?
  • @ci_ 它填充了内部。我想在抽签之外填写
  • tempPath.toggleInverseFillType() 那么?
  • 我觉得this answer可以帮你解决问题。

标签: android canvas draw paint


【解决方案1】:

我找到了实现目标的方法。这是代码:

int height = getMeasuredHeight();
int width = getMeasuredWidth();
Path backpath = new Path();
backpath.moveTo(0, 0);
backpath.lineTo(0, width);
backpath.lineTo(height, width);
backpath.lineTo(height, 0);
backpath.setFillType(Path.FillType.EVEN_ODD);
for(ArrayList<PointF> arc : drawings) {
    Iterator<PointF> iter = arc.iterator();
    Path tempPath = new Path();
    PointF p = iter.next();
    tempPath.moveTo(p.x, p.y);
    while (iter.hasNext()) {
        PointF l = iter.next();
        tempPath.quadTo(p.x, p.y, l.x, l.y);
        p = l;
    }
    tempPath.lineTo(p.x, p.y);
    backpath.addPath(tempPath);
    canvas.drawPath(path, mBackgroundPaint);
    canvas.drawPath(tempPath, paint);
}

Path.FillType.EVEN_ODD 在这里完成工作。我使用了两条路径。第一个用于真实绘图,tempPath。第二个是绘制背景色,backpath。绘制边界后,我将tempPath的副本添加到backpath中。通过设置适当的绘画风格,我得到以下结果:

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多