2012-05-13 143 views
2

我正在尝试开发一个简单的“绘制触摸”,并且我想绘制用户放置在onTouch侦听器中的不同路径。 我有一个简单的问题。绘制路径时,我会获取最后一个onTouch条目中绘制的单个路径。 我认为路径都是在最后一条路径上绘制的,因为我使用了一个150 alpha的Paint,它在第二个和后续的onTouch条目中看起来更坚实。Android:绘制多个路径

我怎么能解决这个问题?谢谢!

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; 


} 
} 

回答

2

的问题是,你是画在points列表反复与点构建路径。

注意invalidate()呼叫onTouch,每次这个调用会触发一个重绘事件,这将导致onDraw被调用,一切都看起来不错,在这一点上。问题是你只在ACTION_DOWN事件上做过points.clear()事件,但你也应该有ACTION_MOVEACTION_UP事件中清除它们。相反,您保留先前收集的所有点,并绘制onDraw中所有这些点构建的路径。因此,您正在有效地绘制一些使用先前收集的点构建的路径。在一个拖动运动

注意,会有1 ACTION_DOWNÑACTION_MOVE0或1 ACTION_UP事件。

+0

现在,我了解Path运行的方式。我不需要创建多个路径,只需一个就可以完成所有任务。代码被修改了,我不需要任何'points.clear()'所有我需要做的就是直接在'onTouch()'方法中使用'moveTo'生成'路径'到'ACTION_DOWN'中, 'ACTION_MOVE'中的'lineTo'和'ACTION_UP'中的'lineTo'。然后在'onDraw'方法中,我需要的是绘制我所拥有的唯一路径。 – SamuSan