【问题标题】:Android: Drawing multiple pathsAndroid:绘制多条路径
【发布时间】:2012-05-21 01:23:41
【问题描述】:

我正在尝试开发一个简单的“触摸绘图”,我想绘制用户在 onTouch 侦听器中放置的不同路径。 我有一个简单的问题。当我绘制路径时,我获得了在最后一个 onTouch 条目的点中绘制的单个路径。 我认为这些路径都是在最后一条路径上绘制的,因为我使用了 150 alpha 的 Paint,它在第二个和连续的 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;


}
}

【问题讨论】:

    标签: android path android-canvas


    【解决方案1】:

    问题是您正在绘制由points 列表中的点重复构建的路径。

    注意invalidate()调用onTouch,每次调用都会触发重绘事件,导致onDraw被调用,此时一切正常。问题是您只在ACTION_DOWN 事件上做了points.clear(),但您也应该ACTION_MOVEACTION_UP 事件上清除它们。相反,您保留之前收集的所有点,并在onDraw 中绘制由所有这些点构建的路径。因此,您实际上是在重复绘制一些使用先前收集的点构建的路径。

    注意在拖动动作中,会有1 ACTION_DOWNN ACTION_MOVE0或1 ACTION_UP事件。

    【讨论】:

    • 谢谢,现在我明白了 Path 的运行方式。我不需要创建多条路径,只需一条即可完成所有操作。代码已修改,我不需要任何“points.clear()”,我所要做的就是使用“moveTo”直接在“onTouch()”方法中生成“路径”到“ACTION_DOWN”中, 'ACTION_MOVE' 中的 'lineTo' 和 'ACTION_UP' 中的 'lineTo'。然后在“onDraw”方法中,我只需要绘制我拥有的唯一路径。
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多