2013-04-13 4 views
1

Я создаю приложение, которое позволяет пользователю рисовать на экране. Мой код фактически создает Path, а затем создает строку. Но это, когда пользователь поднимает палец экрана и переходит в другую часть экрана, он делает линию, как это происходит в следующем видео. http://youtu.be/CBv1wtUC2g4Восстановить объект, не удаляя последний

Следующий код - код drawview.

public class DrawView extends View implements OnTouchListener { 
private static final String TAG = "DrawView"; 

List<Point> points = new ArrayList<Point>(); 
Paint paint = new Paint(); 
int action; 
int draw=0; 
Boolean finger=true; 

public DrawView(Context context) { 
    super(context); 
    setFocusable(true); 
    setFocusableInTouchMode(true); 

    this.setOnTouchListener(this); 

    paint.setColor(Color.BLACK); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth(5); 
    paint.setAntiAlias(true); 
    } 

@Override 
protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 

    Path path = new Path(); 
    boolean first = true; 

     for(int i = 0; i < points.size(); i += 2){ 
      Point point = points.get(i); 

       if(first){ 
        first = false; 
        path.moveTo(point.x, point.y); 
       } 
       else if(i < points.size() - 1){ 
        Point next = points.get(i + 1); 
        path.quadTo(point.x, point.y, next.x, next.y); 
       } 
       else { 
        path.lineTo(point.x, point.y); 
       } 

      } 

    canvas.drawPath(path, paint);  

} 
    public boolean onTouch(View view, MotionEvent event) { 
     action = event.getAction(); 

     Point point = new Point(); 
     point.x = event.getX(); 
     point.y = event.getY(); 
     points.add(point); 
     invalidate();  
     Log.d(TAG, "point: " + point); 

     if (action == MotionEvent.ACTION_MOVE) { 
      finger = true; 
     } 
     if (action == MotionEvent.ACTION_UP) { 
      finger = false; 
     } 
     draw++; 
     return true; 
    } 
} 

class Point { 
    float x, y; 

    @Override 
    public String toString() { 
     return x + ", " + y; 
    } 
} 

Кроме того, я думаю, что, может быть, что я хочу, что мне нужно это массив, который содержит объекты (пути и линии), но я не знаю, как это сделать. Используя этот метод, я думаю, что я смогу вернуться к удалению последнего объекта, возможно ли это возможно?

ответ

3

Вам нужно создать другой «Путь» каждый раз, когда пользователь поднимает палец. Я изменил свой код, чтобы сделать это. Попробуйте, чтобы убедиться, что это то, что вам нужно.

import java.util.ArrayList; 
import java.util.List; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 

public class DrawView extends View implements OnTouchListener { 

    private static final String TAG = "DrawView"; 

    private List<List<Point>> _paths = new ArrayList<List<Point>>(); 
    private List<Point> _lastPath; 
    private Paint _paint = new Paint(); 
    private Path _path = new Path(); 

    public DrawView(Context context) { 
     super(context); 

     setFocusable(true); 
     setFocusableInTouchMode(true); 
     setOnTouchListener(this); 

     _paint.setColor(Color.BLACK); 
     _paint.setStyle(Paint.Style.STROKE); 
     _paint.setStrokeWidth(5); 
     _paint.setAntiAlias(true); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     for (List<Point> pointsPath : _paths) { 
      _path.reset(); 
      boolean first = true; 

      for (int i = 0; i < pointsPath.size(); i += 2) { 
       Point point = pointsPath.get(i); 

       if (first) { 
        first = false; 
        _path.moveTo(point.x, point.y); 
       } else if (i < pointsPath.size() - 1) { 
        Point next = pointsPath.get(i + 1); 
        _path.quadTo(point.x, point.y, next.x, next.y); 
       } else { 
        _path.lineTo(point.x, point.y); 
       } 
      } 
      canvas.drawPath(_path, _paint); 
     } 
    } 

    public boolean onTouch(View view, MotionEvent event) { 
     Point point = new Point(); 
     point.x = event.getX(); 
     point.y = event.getY(); 
     Log.d(TAG, "point: " + point); 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      _lastPath = new ArrayList<Point>(); 
      _lastPath.add(point); 
      _paths.add(_lastPath); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      _lastPath.add(point); 
      break; 
     } 
     invalidate(); 
     return true; 
    } 

    private class Point { 
     float x, y; 

     @Override 
     public String toString() { 
      return x + ", " + y; 
     } 
    } 
} 
+0

Это работает !!!! Я люблю тебя !!!!, завтра я дам тебе +1 –

Смежные вопросы