使用path.lineTo()时,对角线看起来比直线更粗

时间:2018-09-28 14:49:15

标签: android android-drawable ondraw

我创建了一个扩展Shape的类,以便为按钮的背景绘制自定义形状(带有切角的矩形)。我的问题是绘制为对角线的线比直线粗得多:

enter image description here

我怎样才能使边框始终保持一致的宽度?我尝试将抗锯齿设置为true / false,但这没什么作用

public class ShapeMaker extends Shape {
private float STROKE_WIDTH = 20.0f;

private final Paint border = new Paint();
private final Path path;


private float tl = 0; //Top Left
private float tr = 0; //Top Right
private float bl = 0; //Bottom Left
private float br = 0; //Bottom Right


public ShapeMaker(float tl, float tr, float bl, float br, int fillColor) {
    path = new Path();
    this.tl = tl;
    this.tr = tr;
    this.bl = bl;
    this.br = br;

    border.setColor(fillColor);
    border.setStyle(Paint.Style.STROKE);
    border.setStrokeWidth(STROKE_WIDTH);
    border.setAntiAlias(true);
    border.setDither(true);
    border.setStrokeJoin(Paint.Join.ROUND);
    border.setStrokeCap(Paint.Cap.ROUND);
}

@Override
protected void onResize(float width, float height) {
    super.onResize(width, height);
    path.reset();

    path.moveTo(0 + tl, 0);
    path.lineTo(width - tr, 0);
    path.lineTo(width, tr);
    path.lineTo(width, height-br);
    path.lineTo(width-br, height);
    path.lineTo(0+bl, height);
    path.lineTo(0, height-bl);
    path.lineTo(0, 0+tl);
    path.lineTo(0 + tl, 0);

    path.close();
}

@Override
public void draw(Canvas canvas, Paint paint) {
    canvas.drawPath(path, border);
}
}

用法:

Button button = findViewById(R.id.buttom);
float den = getResources().getDisplayMetrics().density;
button.setBackground(new ShapeDrawable(new ShapeMaker(den * 15, 0, 0, 0, Color.RED)));

1 个答案:

答案 0 :(得分:3)

简单的答案是将线向内(远离视图的边缘)“移动”一定距离,即笔划宽度的一半。

您的路径会跟踪视图的确切边缘。实际绘制笔划时,它以该路径为中心。这意味着笔触的一半在视图范围之外,因此被裁剪。

但是,当您绘制路径的对角线部分时,您将完全在视图的边界内进行绘制,因此不会发生剪切。这样一来,对角线笔划的厚度似乎是其余笔划的两倍。

这相当于您编写的代码:

int inset = (int) border.getStrokeWidth() / 2;

path.reset();
path.moveTo(notch + inset, inset);
path.lineTo(width - inset, inset);
path.lineTo(width - inset, height - inset);
path.lineTo(inset, height - inset);
path.lineTo(inset, notch + inset);
path.close();