gpt4 book ai didi

java - Android 如何沿着手指画一条平滑线

转载 作者:IT老高 更新时间:2023-10-28 13:16:30 25 4
gpt4 key购买 nike

http://marakana.com/tutorials/android/2d-graphics-example.html

我在下面使用这个例子。但是当我在屏幕上移动手指太快时,线条会变成单个点。

我不确定是否可以加快绘图速度。或者我应该用一条直线连接最后两个点。这两种解决方案中的第二种似乎是一个不错的选择,除非当您的手指快速移动时,您会看到较长的直线段,然后是陡峭的曲线。

如果有任何其他解决方案,很高兴听到它们。

提前感谢您的帮助。

最佳答案

正如您所提到的,一个简单的解决方案是简单地用直线连接点。这是执行此操作的代码:

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;
}
}

这会产生平滑的线条,但有时必须使用循环连接点。此外,对于长时间的绘图 session ,这将变得计算密集。

希望对您有所帮助...有趣的东西。

编辑

我整理了一个快速项目来演示这些不同的技术,包括 Square 建议的签名实现。享受:https://github.com/johncarl81/androiddraw

关于java - Android 如何沿着手指画一条平滑线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com