Java Android平滑多点触控绘图

Java Android平滑多点触控绘图,java,android,drawing,multi-touch,Java,Android,Drawing,Multi Touch,我正在尝试制作一个简单的绘图应用程序。我想要光滑的手指画简单的曲线。并使用多点触摸。我有以下代码: @Override public void onDraw(Canvas canvas) { for (Path path : paths) { canvas.drawPath(path, paint); } } @Override public boolean onTouchEvent(MotionEvent event) { float xPos = e

我正在尝试制作一个简单的绘图应用程序。我想要光滑的手指画简单的曲线。并使用多点触摸。我有以下代码:

@Override
public void onDraw(Canvas canvas) {
    for (Path path : paths) {
        canvas.drawPath(path, paint);
    }
}

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

    if (event.getAction() == MotionEvent.ACTION_DOWN)
    {
        path = new Path();
        path.moveTo(xPos, yPos);
    }
    else if (event.getAction() == MotionEvent.ACTION_MOVE)
    {
        path.lineTo(xPos, yPos);
                    paths.add(path);
    }
    else if (event.getAction() == MotionEvent.ACTION_UP)
    {
        path.lineTo(xPos, yPos);
                    paths.add(path);
    }

    invalidate();

    return true;
}

还有别的路吗?我怎样才能用三个手指画得很流畅?

对于这种类型的应用程序,
MotionEvent
中嵌入了历史信息。在批处理标题下有一个很好的例子,这里是复制粘贴的例子。只需创建扩展视图的类并实现以下方法

private final Paint paint = new Paint(); // Don't forgot to init color, form etc.

@Override
protected void onDraw(Canvas canvas) {
    for (int size = paths.size(), i = 0; i < size; i++) {
        Path path = paths.get(i);
        if (path != null) {
            canvas.drawPath(path, paint);
        }
    }
}

private HashMap<Integer, Float> mX = new HashMap<Integer, Float>();
private HashMap<Integer, Float> mY = new HashMap<Integer, Float>();
private HashMap<Integer, Path> paths = new HashMap<Integer, Path>();

@Override
public boolean onTouchEvent(MotionEvent event) {
    int maskedAction = event.getActionMasked();

    Log.d(TAG, "onTouchEvent");

    switch (maskedAction) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN: {
            for (int size = event.getPointerCount(), i = 0; i < size; i++) {
                Path p = new Path();
                p.moveTo(event.getX(i), event.getY(i));
                paths.put(event.getPointerId(i), p);
                mX.put(event.getPointerId(i), event.getX(i));
                mY.put(event.getPointerId(i), event.getY(i));
            }
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            for (int size = event.getPointerCount(), i = 0; i < size; i++) {
                Path p = paths.get(event.getPointerId(i));
                if (p != null) {
                    float x = event.getX(i);
                    float y = event.getY(i);
                    p.quadTo(mX.get(event.getPointerId(i)), mY.get(event.getPointerId(i)), (x + mX.get(event.getPointerId(i))) / 2,
                            (y + mY.get(event.getPointerId(i))) / 2);
                    mX.put(event.getPointerId(i), event.getX(i));
                    mY.put(event.getPointerId(i), event.getY(i));
                }
            }
            invalidate();
            break;
        }
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL: {
            for (int size = event.getPointerCount(), i = 0; i < size; i++) {
                Path p = paths.get(event.getPointerId(i));
                if (p != null) {
                    p.lineTo(event.getX(i), event.getY(i));
                    invalidate();
                    paths.remove(event.getPointerId(i));
                    mX.remove(event.getPointerId(i));
                    mY.remove(event.getPointerId(i));
                }
            }
            break;
        }
    }

    return true;
}
private final Paint Paint=new Paint();//别忘了初始化颜色、形状等。
@凌驾
受保护的void onDraw(画布){
对于(int size=path.size(),i=0;i
那么现在的代码会发生什么变化?你还需要记住,有许多不同的设备,并不是所有的设备都能同样好地处理多点触摸。@Warpzit它在画我用手指画的东西,但它太慢了。我认为这是因为在数组列表中添加了太多的路径。但如果我清除它。它将删除我以前的曲线。我应该把它们转换成什么吗?我想使用此应用程序满足我的需要。我的手机支持多点触控,所以我想使用它。不要认为这是因为什么,你需要测试它。尝试添加打印路径长度的logcat。不要在调试模式下运行它,因为默认情况下这会使它运行缓慢:)过一段时间后,数组的大小会超过100,并且会越来越慢。我尝试添加路径。清除();进入一个新的事件。现在速度很快。但是我上面写的有一个问题。我可以在touchEvent中绘制而不使用变量吗?打电话给draw?谢谢,它很好用!这是一个很好的例子,可以用于其他有相同问题的人:对于多点触摸,我使用event.getPointerCount();然后是event.getX(指针索引);嗨,你是怎么用多点触控的?需要“保存”要绘制的点吗?如果你能发布这部分代码,我真的很感激