2012-05-13 142 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