android 手指滑动画线,Android如何用手指画一条平滑的线

这篇博客探讨了如何在Android中平滑地连接一系列点来创建线条。通过使用Path对象,结合moveTo、lineTo、quadTo和cubicTo方法,可以实现不同级别的平滑效果。代码示例展示了从简单直线连接到三次样条插值的逐步过程,以创建更加平滑的视觉体验。此外,还提供了一个优化的onTouchEvent处理,以避免重复的运动事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小编典典

正如你提到的,一个简单的解决方案是简单地将点与直线连接起来。这是这样做的代码:

public void onDraw(Canvas canvas) {

Path path = new Path();

boolean first = true;

for(Point point : points){

if(first){

first = false;

path.moveTo(point.x, point.y);

}

else{

path.lineTo(point.x, point.y);

}

}

canvas.drawPath(path, paint);

}

确保将油漆从填充更改为描边:

paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeWidth(2);

paint.setColor(Color.WHITE);

另一个选择是使用quadTo方法将点与迭代连接:

public void onDraw(Canvas canvas) {

Path path = new Path();

boolean first = true;

for(int i = 0; i < points.size(); i += 2){

Point point = points.get(i);

if(first){

first = false;

path.moveTo(point.x, point.y);

}

else if(i < points.size() - 1){

Point next = points.get(i + 1);

path.quadTo(point.x, point.y, next.x, next.y);

}

else{

path.lineTo(point.x, point.y);

}

}

canvas.drawPath(path, paint);

}

这仍然会导致一些尖锐的边缘。

如果你确实有野心,则可以开始如下计算三次样条:

public void onDraw(Canvas canvas) {

Path path = new Path();

if(points.size() > 1){

for(int i = points.size() - 2; i < points.size(); i++){

if(i >= 0){

Point point = points.get(i);

if(i == 0){

Point next = points.get(i + 1);

point.dx = ((next.x - point.x) / 3);

point.dy = ((next.y - point.y) / 3);

}

else if(i == points.size() - 1){

Point prev = points.get(i - 1);

point.dx = ((point.x - prev.x) / 3);

point.dy = ((point.y - prev.y) / 3);

}

else{

Point next = points.get(i + 1);

Point prev = points.get(i - 1);

point.dx = ((next.x - prev.x) / 3);

point.dy = ((next.y - prev.y) / 3);

}

}

}

}

boolean first = true;

for(int i = 0; i < points.size(); i++){

Point point = points.get(i);

if(first){

first = false;

path.moveTo(point.x, point.y);

}

else{

Point prev = points.get(i - 1);

path.cubicTo(prev.x + prev.dx, prev.y + prev.dy, point.x - point.dx, point.y - point.dy, point.x, point.y);

}

}

canvas.drawPath(path, paint);

}

另外,我发现你需要更改以下内容以避免重复的运动事件:

public boolean onTouch(View view, MotionEvent event) {

if(event.getAction() != MotionEvent.ACTION_UP){

Point point = new Point();

point.x = event.getX();

point.y = event.getY();

points.add(point);

invalidate();

Log.d(TAG, "point: " + point);

return true;

}

return super.onTouchEvent(event);

}

并将dx和dy值添加到Point类:

class Point {

float x, y;

float dx, dy;

@Override

public String toString() {

return x + ", " + y;

}

}

这样可以产生平滑的线条,但有时必须使用循环将点连接起来。另外,对于较长的绘图会话,这将需要大量计算才能计算。

希望对你有所帮助。

2020-03-13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值