2012-10-24 15 views
35
public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     TableView tv = new TableView(this); 
     tv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); 
     setContentView(tv);  
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 

public class TableView extends ViewGroup { 
    private Paint oval; 
    private RectF rect; 

    public TableView(Context context) { 
     super(context); 
     oval= new Paint(Paint.ANTI_ALIAS_FLAG); 
     oval.setColor(Color.GREEN); 
    } 


    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawOval(rect , oval); 
    } 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int wspec = MeasureSpec.makeMeasureSpec(
       getMeasuredWidth(), MeasureSpec.EXACTLY); 
     int hspec = MeasureSpec.makeMeasureSpec(
       getMeasuredHeight(), MeasureSpec.EXACTLY); 
     for(int i=0; i<getChildCount(); i++){ 
      View v = getChildAt(i); 
      v.measure(wspec, hspec); 
     } 
    } 


    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     float w=r-l; 
     float h=b-t; 
     rect=new RectF(w/8,h/8,7*w/8,7*h/8); 
     float theta = (float) (2 * Math.PI/getChildCount()); 
     for(int i=0; i< getChildCount(); i++) { 
      View v = getChildAt(i); 
      w = (rect.right-rect.left)/2; 
      h = (rect.bottom-rect.top)/2; 
      float half = Math.max(w, h)/2; 
      float centerX = rect.centerX()+w*FloatMath.cos(theta); 
      float centerY = rect.centerY()+h*FloatMath.sin(theta); 
      v.layout((int)(centerX-half),(int)(centerY-half),(int)(centerX+half),(int)(centerY+half)); 
     } 
    } 
} 

Otóż istnieje prawie żaden dobry i głębokie tutoriale i prawie każdy kawałek danych na temat jak to zrobić niestandardowe układy prawo, więc próbowałem dowiedzieć się, jak jej zrobić, co Próbuję zaimplementować układ, który maluje zielony owal na środku ekranu, i chcę, aby każde dziecko tego układu było ułożone wokół owalu.Android klienta Układ - OnDraw() nigdy nie jest wywoływana

Możesz myśleć o tym owalu jako o stole do pokera, który chcę, aby dzieci tego układu siedziały wokół niego.

Co obecnie dzieje się przez ten kod jest to, że mogę dostać białe scren Aplikacja z żadnym owalu, więc debugowany go i zobaczyłem, że nigdy OnDraw jest wywoływana ...

3 pytania:

  1. dlaczego to, że onDraw nie jest wywoływany?
  2. sdk ostrzega mnie, że nie powinienem przydzielać nowych obiektów w metodzie onLayout, więc gdzie powinienem obliczyć RectF, aby był gotowy na wywołanie onDraw?
  3. Czy wywołanie super.onDraw() sprawiłoby, że wszystkie dzieci same się pomalowały? lub powinienem jawnie wywołać ich draw()?

Jeśli coś jest nie tak i możesz poprowadzić mnie we właściwym kierunku lub mieć linki do przykładów lub tutoriali związanych z tym tematem, które również byłyby pomocne!

Odpowiedz

119

Domyślnie onDraw() nie jest wywoływana dla obiektów ViewGroup. Zamiast tego możesz zastąpić dispatchDraw().

Można również włączyć rysowanie ViewGroup, wywołując setWillNotDraw(false) w swoim konstruktorze TableView.

Patrz: Romain Guy's explanation

EDIT:

Dla # 2: - zainicjować w konstruktorze, a potem po prostu zadzwonić rect.set() w swojej metodzie onLayout().

Dla nr 3: - Tak, o ile mi wiadomo, super wywołanie obsłuży to, nie powinieneś tego robić, chyba że musisz dostosować sposób, w jaki dzieci są rysowane.

+0

wielka, że ​​pracował, dzięki !, a co inne moje pytania? –

+0

@kcoppock
Wymieniona nazwa metody to ** not ** 'setWillNotDrawEnabled', ale po prostu' setWillNotDraw' (publiczna metoda klasy 'View'). – lambruscoAcido

0

Jeśli chcesz, że płótno jest ponowne losowanie invalidate call(), a metoda OnDraw() zostanie ponownie wykonany

Powiązane problemy