如何在 Android 中的 Canvas 上绘制尖锐的曲线和斜线

How to draw sharp curves and angled lines on Canvas in Android

下图显示了 Canvas 上的输出。曲线和斜线不像水平或垂直直线那样尖锐。我也为 Canvas 设置了 android:hardwareAccelerated="true"ANTI_ALIAS_FLAG。请看下面的代码。如何提高这些曲线的质量(与直线相同)?我使用的是 Nexus S。有没有办法提高 Canvas.

的分辨率

Screenshot of result

结果特写

Path path1 = new Path();
Path path2 = new Path();
public Paint fillPaint = null;
// called in constructor
public void createPath()
{
    //path 1 samll one
    Point[] araay = new Point[]{new Point(36,72),new Point(29,46), new Point(41,70),new Point(42,54),new Point(41,38),new Point(29,64),new Point(36,36)};
    AddBeziers(path1, araay, 72, 36);

    AddLine(path1,72, 36 );
    AddLine(path1, 72, 72 );

    AddLine(path1, 36, 72 );

    //path 2 Big one
    araay = new Point[]{new Point(144,320),new Point(109,200), new Point(171,308),new Point(178,240),new Point(171,172),new Point(109,282),new Point(144,160)};
    AddBeziers(path2, araay, 320, 144);
    AddLine(path2, 216, 144 );
    AddLine(path2, 216, 216 );
    AddLine(path2, 144, 320);

    fillPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    fillPaint.setColor(Color.WHITE);
    fillPaint.setFlags(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
    fillPaint.setAntiAlias(true);
    fillPaint.setDither(true);
    fillPaint.setStrokeJoin(Paint.Join.ROUND);
    fillPaint.setStrokeCap(Paint.Cap.ROUND);
    fillPaint.setStyle(Paint.Style.FILL);

}

 // add lines to the path
protected Path AddLine(Path path, int endX, int endY) {
    //path.moveTo(startX, startY);

    path.lineTo(endX, endY);
    return path;
}

// add curves to the path
protected Path AddBeziers(Path path, Point[] points, int lastX, int lastY) {

    if (points[0].X != lastX && points[0].Y != lastY)
        path.moveTo(points[0].X, points[0].Y);

    int index = 1;

    path.cubicTo(points[index].X, points[index].Y, points[index + 1].X,
        points[index + 1].Y, points[index + 2].X, points[index + 2].Y);
    index = index + 3;
    path.cubicTo(points[index].X, points[index].Y, points[index + 1].X,
        points[index + 1].Y, points[index + 2].X, points[index + 2].Y);

    return path;
}

//draw on canvas
@Override
public void onDraw(Canvas canvas) {

    canvas.drawPath(path1, fillPaint);
    canvas.drawPath(path2, fillPaint);
    super.onDraw(canvas);
}

Is there a way to improve the resolution of Canvas.

您可以为 Bitmap 创建任意大小的 Canvas,使用该 Canvas 绘制您的内容,最后将 Bitmap 绘制到您的首字母Canvas 缩放分辨率,以适应屏幕上的所有内容。

为什么你不应该这样做

您设备的屏幕,以及世界上几乎所有的屏幕,在方形网格中都有方形像素(不用担心子像素)。这意味着既不是水平也不是垂直的线总是会有伪影。像您一样使用抗锯齿是减轻视觉伪影的常用技术,但它们仍然存在。

提高 Canvas 的分辨率对您没有任何帮助,因为 Canvas 上的单个像素已经映射到设备屏幕上的单个像素。

在我看来,你是多虑了。当以常规眼距在设备屏幕上查看结果时,边缘的不清晰度不明显。当您截取设备屏幕内容的屏幕截图并在更大的屏幕上进行检查时,边缘的不清晰度几乎无法察觉,当然这不是我会担心的任何事情。当你放大时,任何人都可以看到它,但你不再期待锐利的边缘。