3

簡単な描画アプリを作ろうとしています。滑らかな指でシンプルな曲線を描きたいです。そして、マルチタッチを使用してください。私は次のコードを持っています:

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

他の方法はどこにありますか?3 本の指できれいにスムーズに描くにはどうすればよいですか?

4

2 に答える 2

1

には、このタイプのアプリケーションのMotionEvent履歴情報が埋め込まれています。バッチ処理の見出しの下にあるhttp://developer.android.com/reference/android/view/MotionEvent.htmlに良い例があります

于 2012-08-15T09:13:11.523 に答える
1

コピペの例です。View を拡張し、次のメソッドを実装するクラスを作成するだけです。

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;
}
于 2014-10-30T14:02:21.937 に答える