2012-02-10 29 views
9

DrawView'im var. Bu görüşe dokunursam küçük daireler çizer. "SetPoints" yardım işleviyle çevreleri çizmeye değil, görünüme dokunmayacağım. Ne yapıyorum:Geçerli tuval nasıl alınır?

package com.samples; 
import ... 

public class DrawView extends View { 
    ArrayList<Point> points = new ArrayList<Point>(); 

    Paint paint = new Paint(); 

    private int pSize = 5; 
    private int pColor = Color.BLACK; 

    public DrawView(Context context, AttributeSet attrs) { 

     super(context, attrs); 

     setFocusable(true); 
     setFocusableInTouchMode(true); 

     this.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       v.setOnTouchListener(this); 
        Point point = new Point(); 
        point.x = event.getX(); 
        point.y = event.getY(); 
        points.add(point); 
        invalidate(); 
       } 
       return true; 
      } 
     }); 
     requestFocus(); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     for (Point point : points) { 
      canvas.drawCircle(point.x, point.y, pSize, paint); 
     } 
    } 

    public void setPoints(Float xP, Float yP) 
    { 
     Point point = new Point(); 
     point.x = xP; 
     point.y = yP; 
     points.add(point); 
     postInvalidate(); 
    } 
} 

class Point { 
    float x, y; 

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

Lütfen, tuvalin setPoints işlevini nasıl belirlediğini söyleyin?

Güncelleme: Wow, gerçekten ilginç bir problem. DrawView'um HorizontalScrollView'da bulunur. Çünkü bu DrawView doğru koordinatlarını ayarlamış olsaydım, kimse nerede çizilebilen daireler olduğunu bilmiyor.

+0

Bu sorunun anlaşılması zor. Lütfen gözden geçirin – Raffaele

+0

Bunu yapmak istediğin şeyi deşifre etmek kolay değil :) İlk şey, bunu kaldır 'canvas2': düşündüğün gibi çalışmıyor. Daha önce çizilen daireyi korumak istediğinden şüpheleniyorum, değil mi? Eğer bu sizin hedefinizse, çekiliş çağrılarının geçmişini sürdürmeniz ve bunu iki şekilde yapabilmeniz gerekir: 1) 'Point [] 'dizisini saklar ve her daireyi" onDraw "içine çizersiniz; veya 2) bir daire eklendiğinde, 'Bitmap' – Raffaele

+0

önbelleğini güncellediğinizde bu çemberi çizmeyeceğim ama ekrana dokunmadım! – Leo

cevap

4

Yapamazsınız. Kanvas sistem tarafından yönetilir ve onDraw() numaranıza geçirilir. Neden bunun dışında ihtiyacın olduğunu anlamıyorum. Sadece Sen onDraw() da daireler çizin

+0

Puanlar pproblem değil, bende kalıyorum. "Canvas canvas" hakkında: Asla onDraw aramadığı takdirde ne yapabilirim? – Leo

+1

Android'in Görünümleri nasıl çizdiğini bilmiyorum. Sistem, bir widget'in (yeniden) boyanması gerektiğini tespit ettiğinde, widget'ınızın kapısını çalar ve "onDraw (Canvas)" ile yanıt verir.Böylece, bu yöntemin her zaman ve her zaman ihtiyaç duyulacağı garanti edilir. _trigger_ _the_ _repaint_ uygulamasının bir yolu, invalidate() '(veya' postInvalidate') 'i çağırmaktır. Bu yüzden kendinizi asla aramak zorunda kalmazsınız, ancak gerektiğinde Android'in bunu çağıracağından emin olun. Geri aramayı sağlamalısınız. Ayrıca, "Çevrelere çekmek istiyorum ama görünmemek istiyorum" ile ne demek istediğinizi belirtin – Raffaele

+0

Bana link veya anahtar kelime verebilir misiniz? – Leo

1

Tuval 2'yi DrawView sınıfında genel değişken olarak bildirmeyi deneyin.

+0

Sorun yalnızca Tuval çağrısında. – Leo

0

önceki çizimlerin bir önbellek tutmak (veya önceki noktalarını depolamak) bu

public void setPoints(Canvas canvas, Float xP, Float Yp) 

gibi setPoints redeclare. View'un çalışması gereken tekniktir (teknik olarak aslında draw() yöntemindedir, ancak bunu göz ardı edeceğiz). setPoints()'da, dairenin noktalarını sınıf kapsamı içindeki değişkenlere ayarlayın, invalidate()'u arayın, ardından onDraw()'da bu şekilde daire çizin. Bu yöntemi izlerseniz, görünümün tasarlandığı sınıf akışını takip ediyorsunuz.

+0

hmm .. public void setPuanlar (Float xP, Float Yp) { canvas2.drawCircle (xP, yP, 5, boya);) (Geçersiz; } öyleyse? – Leo

+0

Hayır. Canvas2.drawCircle (xP, yP, 5, paint); 'inDraw()' içinde gider. "XP", "yP" değerlerini kaydedin ve "setPoints()" invalidate() karakterini çağırın. – DeeV

+0

Güncel kodlara bakın, lütfen – Leo

İlgili konular