Khác biệt giữa phương thức lineTo và quadTo trong lớp Path của Android

Trong lập trình Android, lớp Path được sử dụng để vẽ các đường phức tạp. Hai phương thức lineTo()quadTo() có cách hoạt động khác biệt đáng kể:

1. Phương thức quadTo

quadTo(float cx, float cy, float ex, float ey) tạo đường cong Bezier bậc hai mượt mà. Tham số cx, cy là tọa độ điểm điều khiển, ex, ey là điểm kết thúc. Ví dụ minh họa:

public class CurveView extends View {
    private float lastX, lastY;
    private final Path tracePath = new Path();
    private final Paint drawPaint = new Paint();

    public CurveView(Context ctx) {
        super(ctx);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeWidth(8);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawPath(tracePath, drawPaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                tracePath.moveTo(x, y);
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                float midX = (x + lastX) / 2;
                float midY = (y + lastY) / 2;
                tracePath.quadTo(lastX, lastY, midX, midY);
                lastX = x;
                lastY = y;
                invalidate();
                break;
        }
        return true;
    }
}

2. Phương thức lineTo

lineTo(float x, float y) nối trực tiếp điểm hiện tại với tọa độ chỉ định bằng đoạn thẳng. Ví dụ:

public class StraightLineView extends View {
    private float prevX, prevY;
    private final Path linePath = new Path();
    private final Paint linePaint = new Paint();

    public StraightLineView(Context ctx) {
        super(ctx);
        linePaint.setStyle(Paint.Style.STROKE);
        linePaint.setStrokeWidth(8);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawPath(linePath, linePaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                linePath.moveTo(x, y);
                prevX = x;
                prevY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                linePath.lineTo(x, y);
                prevX = x;
                prevY = y;
                invalidate();
                break;
        }
        return true;
    }
}

So sánh hiệu ứng

  • quadTo: Tạo đường cong mượt khi vẽ hình lượn sóng
  • lineTo: Tạo các đoạn thẳng nối liền, gây gấp khúc tại điểm nối

Tối ưu hóa với SurfaceView

Sử dụng SurfaceView cho hiệu suất cao hơn khi vẽ đường cong động:

public class BezierSurface extends SurfaceView implements SurfaceHolder.Callback {
    private Path surfacePath = new Path();
    private Paint surfacePaint = new Paint();

    public BezierSurface(Context ctx) {
        super(ctx);
        getHolder().addCallback(this);
        surfacePaint.setStrokeWidth(8);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Canvas c = holder.lockCanvas();
        c.drawPath(surfacePath, surfacePaint);
        holder.unlockCanvasAndPost(c);
    }

    // Xử lý sự kiện chạm tương tự quadTo
}

Thẻ: Android-Graphics Path-class Bezier-curve Canvas-drawing View-customization

Đăng vào ngày 23 tháng 6 lúc 04:53