2012-05-13 8 views
2

私は単純な「ドローオンタッチ」を開発しようとしています。ユーザーがonTouchリスナーに配置するさまざまなパスを描きたいと思います。 私は単純な問題があります。パスを描画すると、最後のonTouchエントリのポイントで描画された単一のパスが取得されます。 私はパスが最後のパス上に描画されていると思います。私は150アルファでペイントを使用しているため、2番目の連続したonTouchエントリでより頑丈に見えます。Android:Drawing multiple paths

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

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リスト内のポイントで構成パスを描いているということです。

onTouchinvalidate()呼び出し、この呼び出しの各onDrawが呼ばれるようになり、再描画イベントをトリガすることを、すべてのものは、この時点で正常に見えます。問題は、ACTION_DOWNイベントでpoints.clear()を実行しただけですが、にはACTION_MOVEACTION_UPというイベントをクリアする必要があります。代わりに、以前に収集したすべてのポイントを保持し、それらのポイントすべてを使用して構築されたパスをonDrawに描画します。したがって、以前に収集したポイントで構築されたパスの一部を効果的に繰り返し描画しています。ドラッグ動作に

注、1 ACTION_DOWNN ACTION_MOVE0又は1 ACTION_UPイベントが存在するであろう。

+0

ありがとう、私はパスが走る方法を理解しました。私は複数のパスを作成する必要はありません。私は1つだけすべてを行うことができます。コードは変更され、私は '点'を必要としません。点 'clear'( 'moveTo'を 'ACTION_DOWN'に 'onTouch()'メソッドで直接 'Path' 'ACTION_MOVE'の 'lineTo'と 'ACTION_UP'の 'lineTo' intです。次に、 'onDraw'メソッドでは、私が必要とするのは、私が持っている唯一の道を描くことだけです。 – SamuSan