Flutter 仿qq消息拖拽效果经过自定义view实现,效果以下 git
var angleA = atan((during.dx - end.dx) / (end.dy - during.dy));
var temp_dx = cos(angleA) * lineWidth;
var temp_dy = sin(angleA) * lineWidth;
var firstControlPoint = Offset(end.dx + (during.dx - end.dx) / 2, during.dy + (end.dy - during.dy) / 2);
var firstPoint = Offset(during.dx + temp_dx, during.dy + temp_dy);
var secondPoint = Offset(end.dx - temp_dx * ratio, end.dy - temp_dy * ratio);
/**
p1 p3
|------------------------|
| |
| |
|------------------------|
p2 p4
*/
// 原点 -> p1
path.moveTo(end.dx - temp_dx * ratio, end.dy - temp_dy * ratio);
// p1 -> p2
path.lineTo(end.dx + temp_dx * ratio, end.dy + temp_dy * ratio);
// p2 -> p4
path.quadraticBezierTo(firstControlPoint.dx, firstControlPoint.dy, firstPoint.dx, firstPoint.dy);
// p4 -> p3
path.lineTo(during.dx - temp_dx, during.dy - temp_dy);
// p3 -> p1
path.quadraticBezierTo(firstControlPoint.dx, firstControlPoint.dy, secondPoint.dx, secondPoint.dy);
canvas.drawPath(path, paint);
canvas.drawCircle(end, lineWidth * ratio, paint);
canvas.drawCircle(during, lineWidth, paint);
复制代码
若有问题欢迎留言指正.github
演示Demo下载canvas