2

シンプルな「ドロー オン タッチ」を開発しようとしています。ユーザーが onTouch リスナーに配置するさまざまなパスを描画したいと考えています。簡単な問題があります。パスを描画すると、最後の onTouch エントリのポイントに描画された単一のパスが取得されます。アルファ 150 の Paint を使用しており、2 番目以降の onTouch エントリではよりしっかりしているように見えるため、パスはすべて最後のパスの上に描かれていると思います。

どうすればそれを解決できますか?ありがとう!

public class PaintView extends View implements OnTouchListener {


List<List<Point>> paths = new ArrayList<List<Point>>();
List<Point> points = new ArrayList<Point>();
Paint paintLine = new Paint();
Paint paintCircle = new Paint();

public PaintView(Context context) {
    super(context);
    setFocusable(true);
    setFocusableInTouchMode(true);

    this.setOnTouchListener(this);

    paintLine = new Paint(Paint.ANTI_ALIAS_FLAG);
    paintLine.setStyle(Paint.Style.STROKE);
    paintLine.setStrokeWidth(10);
    paintLine.setColor(Color.GREEN);
    paintLine.setAlpha(150);
}

public void onDraw(Canvas canvas) {
    Path path = new Path();
    List<Point> pointsList;
    List<Path> pathList = new ArrayList<Path>();
    Point point = new Point();

    for (int i = 0; i < paths.size(); i++) {
        pointsList = paths.get(i);

        path.reset();
        boolean first = true;

        for (int j = 0; j < points.size(); j+=2 ) {
            point = pointsList.get(j);

            if (first) {
                first = false;
                path.moveTo(point.x, point.y);
            } else if (j < pointsList.size() - 1 ) {
                Point nextPoint = pointsList.get(j+1);
                path.quadTo(point.x, point.y, nextPoint.x, nextPoint.y);
            } else {
                path.lineTo(point.x, point.y);
            }

        }

        pathList.add(path);
    }

    for (Path pathDraw : pathList) {
        canvas.drawPath(pathDraw, paintLine);
    }

}

public boolean onTouch(View view, final MotionEvent event) {
    Point point = new Point();
    point.x = event.getX();
    point.y = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        // DO SOMETHING
        points.clear();
        points.add(point);
        break;
    case MotionEvent.ACTION_MOVE:
        points.add(point);
        break;
    case MotionEvent.ACTION_UP:
        points.add(point);
        paths.add(points);
        break;
    default:
        return false;
    }
    invalidate();
    return true;


}
}
4

1 に答える 1

1

points問題は、リスト内のポイントで構築されたパスを繰り返し描画していることです。

invalidate()を呼び出すとonTouch、この呼び出しのそれぞれが再描画イベントをトリガーし、それが呼び出されることに注意してくださいonDraw。この時点ではすべてが正常に見えます。問題はpoints.clear()ACTION_DOWNイベントでのみ実行したことですが、イベントでそれらをクリアする必要ACTION_MOVEもありACTION_UPます。代わりに、以前に収集したすべてのポイントを保持し、のすべてのポイントで構築されたパスを描画しますonDraw。したがって、以前に収集したポイントで構築されたパスの一部を効果的に繰り返し描画しています。

ドラッグモーションでは、1つのACTION_DOWNN ACTION_MOVE0または1つのACTION_UPイベントが発生することに注意してください。

于 2012-05-13T03:12:55.253 に答える