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() và 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ónglineTo: 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
}