2013-05-25 14 views
9

Mam niestandardowy układ do rysowania linii na podstawie danych dotykowych. Mam to rysowanie linii, ale kiedy użytkownik dotknie ekranu, linia rozmywa i rysuje nową linię. To, co chcę zrobić, to narysować nową linię i zostawić tam poprzednią linię. Oto mój kod:Android Canvas drawLine

import android.content.Context; 
    import android.graphics.Canvas; 
    import android.graphics.Color; 
    import android.graphics.Paint; 
    import android.util.AttributeSet; 
    import android.view.MotionEvent; 
    import android.view.View; 

    public class DrawView extends View { 
     Paint paint = new Paint(); 
     float startX; 
     float startY; 
     float stopX; 
     float stopY; 

     public DrawView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     paint.setAntiAlias(true); 
     paint.setStrokeWidth(6f); 
     paint.setColor(Color.BLACK); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeJoin(Paint.Join.ROUND); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      canvas.drawLine(startX, startY, stopX, stopY, paint); 
     } 

     @Override 
       public boolean onTouchEvent(MotionEvent event) { 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      startX = event.getX(); 
      startY = event.getY(); 
      return true; 
     case MotionEvent.ACTION_MOVE: 
      stopX = event.getX(); 
      stopY = event.getY(); 
     break; 
     case MotionEvent.ACTION_UP:  
      stopX = event.getX(); 
      stopY = event.getY(); 
      break; 
     default: 
      return false; 
     } 
      Invalidate(); 
     return true; 
     } 
    } 

Odpowiedz

13

trzeba przechowywać wszystkie linie, a nie tylko ostatni.
Poniższy kod jest całkowicie nietestowany, ale mam nadzieję, że daje ogólny pomysł.

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
import java.util.ArrayList; 

class Line { 
    float startX, startY, stopX, stopY; 
    public Line(float startX, float startY, float stopX, float stopY) { 
    this.startX = startX; 
    this.startY = startY; 
    this.stopX = stopX; 
    this.stopY = stopY; 
    } 
    public Line(float startX, float startY) { // for convenience 
    this(startX, startY, startX, startY); 
    } 
} 

public class DrawView extends View { 
    Paint paint = new Paint(); 
    ArrayList<Line> lines = new ArrayList<Line>(); 

    public DrawView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    paint.setAntiAlias(true); 
    paint.setStrokeWidth(6f); 
    paint.setColor(Color.BLACK); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeJoin(Paint.Join.ROUND); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
    for (Line l : lines) { 
     canvas.drawLine(l.startX, l.startY, l.stopX, l.stopY, paint); 
    } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     lines.add(new Line(event.getX(), event.getY())); 
     return true; 
    } 
    else if ((event.getAction() == MotionEvent.ACTION_MOVE || 
     event.getAction() == MotionEvent.ACTION_UP) && 
     lines.size() > 0) { 
     Line current = lines.get(lines.size() - 1); 
     current.stopX = event.getX(); 
     current.stopY = event.getY(); 
     Invalidate(); 
     return true; 
    } 
    else { 
     return false; 
    } 
    } 
} 
+0

dzięki. Jeden problem polega na tym, że od czasu do czasu przerysowuje płótno. Jak zatrzymać się od przerysowywania płótna? –

+0

Nie jestem pewien, czy rozumiem ... czy płótno nie powinno zostać przerysowane? Miałem mały błąd w moim kodzie ("ACTION_UP" to "ACTION_MOVE"), które naprawiłem w ciągu 5-minutowego okresu karencji. Może masz nieprawidłową wersję? – tom

+0

dziękuję, że to jest wielki przykład –

0

Android API ramowej stanowi zbiór rysunków 2D API, które pozwalają uczynić swoje własne grafiki na płótnie lub zmodyfikować istniejące Wyświetleń dostosować ich wygląd. Podczas rysowania grafiki 2D zwykle robisz to na jeden z dwóch sposobów:

Narysuj grafikę lub animacje w obiekcie Widok z układu. W ten sposób rysunek twojej grafiki jest obsługiwany przez normalny proces rysowania hierarchii widoku - po prostu definiujesz grafikę, aby przejść do widoku. Narysuj swoją grafikę bezpośrednio na płótnie. W ten sposób osobiście wywołasz metodę onDraw() odpowiedniej klasy (przesyłając ją do swojego płótna) lub jedną z metod Canvas draw ...() (takich jak drawPicture()). W ten sposób kontrolujesz także każdą animację.

+0

Jest to zmienne niejasne, tak naprawdę nie odpowiada na pytanie. –