Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:绘制多条路径_Android_Path_Android Canvas - Fatal编程技术网

Android:绘制多条路径

Android:绘制多条路径,android,path,android-canvas,Android,Path,Android Canvas,我正在尝试开发一个简单的“触摸画图”,我想画出用户在onTouch侦听器中放置的不同路径。 我有一个简单的问题。当我绘制路径时,我在最后一个onTouch条目的点上绘制了一条路径。 我认为这些路径都是在最后一条路径上绘制的,因为我使用了一个150 alpha的绘画,它在第二条和后续的条目中看起来更加坚实 我怎样才能解决这个问题?谢谢 public class PaintView extends View implements OnTouchListener { List<List<

我正在尝试开发一个简单的“触摸画图”,我想画出用户在onTouch侦听器中放置的不同路径。 我有一个简单的问题。当我绘制路径时,我在最后一个onTouch条目的点上绘制了一条路径。 我认为这些路径都是在最后一条路径上绘制的,因为我使用了一个150 alpha的绘画,它在第二条和后续的条目中看起来更加坚实

我怎样才能解决这个问题?谢谢

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;


}
}
public类PaintView扩展了视图实现OnTouchListener{
列表路径=新的ArrayList();
列表点=新的ArrayList();
油漆线=新油漆();
绘制画圈=新绘制();
公共PaintView(上下文){
超级(上下文);
设置聚焦(真);
setFocusableInTouchMode(真);
this.setOnTouchListener(this);
油漆线=新油漆(油漆.防油漆别名标志);
绘制线.设置样式(绘制.样式.笔划);
油漆线。设置行程宽度(10);
paintLine.setColor(Color.GREEN);
漆面线。setAlpha(150);
}
公共空白onDraw(画布){
路径路径=新路径();
列表点列表;
列表路径列表=新的ArrayList();
点=新点();
对于(int i=0;i
问题在于,您正在使用
列表中的点反复绘制路径

请注意,
invalidate()
onTouch
中调用,每次调用都会触发一个重画事件,这会导致调用
onDraw
,此时一切看起来都正常。问题是,您只在
动作向下
事件上执行了
点.clear()
,但您也应该在
动作向上
动作向上
事件上执行清除操作。相反,您保留以前收集的所有点,并在
onDraw
中绘制使用所有这些点构建的路径。因此,您可以有效地重复绘制一些使用以前收集的点构造的路径


注意,在拖动运动中,将有1个动作向下N个动作向上0或1个动作向上事件。

谢谢,现在我了解了路径的运行方式。我不需要创建多条路径,我可以用一条路径做任何事情。代码已修改,我不需要任何“points.clear()”,我所要做的就是直接在“onTouch()”方法中生成“Path”,在“ACTION\u DOWN”中使用“moveTo”,在“ACTION\u MOVE”中使用“lineTo”,在“ACTION\u UP”中使用“lineTo”。然后在“onDraw”方法中,我所需要的就是画出我得到的唯一路径。