2013-05-25 9 views
9

Dokunma girdisine dayalı bir çizgi çizmek için özel bir düzenim var. Çizgiyi çiziyorum ama kullanıcı ekrana dokunduğunda, çizgiyi dağıtır ve yeni bir çizgi çizer. Yapmak istediğim şey yeni bir çizgi çizmek ve oradaki bir önceki çizgiyi bırakmak. Bunun yerine sadece sonuncusu tüm satırları depolamak için gerekenAndroid 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; 
     } 
    } 

cevap

13

: İşte benim kodudur.
Aşağıdaki kod tamamen test edilmemiştir, ancak umarım size genel bir fikir verir.

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

Teşekkürler. Bir problem, tuvali her seferinde tekrar tekrar çizmektir. Nasıl duracağım tuvali yeniden çizmekten mi? –

+0

Anladığımdan emin değilim ... tuvalin yeniden çizilmemesi gerekiyor mu? Kodumda küçük bir hata vardı ("ACTION_UP" ACTION_MOVE "idi) ve 5 dakikalık süre zarfında düzelttim. Belki yanlış versiyonun var mı? – tom

+0

Teşekkürler harika eample –

0

Android çerçeve API'leri bir tuval üzerine kendi özel grafik işlemek için veya bunların bir görünüm ve his mevcut Görüntüleme değiştirmesine izin API'leri çizim seti 2D sağlar. 2B grafikler çizerken, genellikle iki yoldan biriyle bunu yaparsınız:

Grafiklerinizi veya animasyonlarınızı, düzeninizdeki bir Görünüm nesnesine çizin. Bu şekilde, grafiğinizin çizimi sistemin normal View hiyerarşi çizim işlemiyle işlenir - grafikleri yalnızca Görünümün içine girecek şekilde tanımlarsınız. Grafiklerinizi doğrudan bir Canvas'a çizin. Bu şekilde, bizzat kendiniz uygun sınıfın onDraw() yöntemini (Canvas'ınızı geçirerek) veya Canvas draw ...() yöntemlerinden birini (drawPicture() gibi) çağırırsınız. Bunu yaparken de herhangi bir animasyonun kontrolü sizde.

+0

Bu, belirsiz değişkendir, gerçekten soruyu cevaplamıyor. –