Android Custom Layout - onDraw () wird nie aufgerufen

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));
        }
    }
}

Nun, es gibt fast KEINE guten und tiefen tutorials und kaum ein Stück von Daten, wie Sie benutzerdefinierte layouts Recht, so habe ich versucht, herauszufinden, wie Ihre getan, was ich versuche zu implementieren ist ein Layout, das Malt ein grünes oval in der Mitte des Bildschirms, und ich will, dass jedes Kind dieses layout gelegt, um das oval.

können Sie denken, oval wie ein poker-Tisch, dass ich will, dass die Kinder dieses layout, um die Sitzfläche herum.

Was derzeit passiert, von diesem code ist, dass ich eine white app scren mit nicht oval, so dass ich Debuggen und sah, dass onDraw wird nie genannt...

3 Fragen:

  1. warum ist onDraw nicht immer genannt?
  2. die sdk warnt mich, dass ich nicht zuordnen von neuen Objekten innerhalb der onLayout-Methode, also wo soll ich berechnen Sie die RectF so ist es bereit für die onDraw-Anruf zu kommen?
  3. hat dem Aufruf von super.onDraw() machen würde, alle Kinder malen sich? oder sollte ich explizit aufgerufen, Ihre draw()?

Wenn ich got it all falsch, und Sie Kerle können mich führen, in die richtige Richtung, oder irgendwelche links zu Beispielen oder tutorials im Zusammenhang mit diesem Thema, das wäre auch hilfreich!

InformationsquelleAutor der Frage Ofek Ron | 2012-10-24

Schreibe einen Kommentar