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:
- warum ist onDraw nicht immer genannt?
- 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?
- 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standardmäßig
onDraw()
ist nicht genannt fürViewGroup
Objekte. Stattdessen können Sie überschreibendispatchDraw()
.Alternativ können Sie aktivieren
ViewGroup
Zeichnung durch den AufrufsetWillNotDraw(false)
in IhremTableView
Konstruktor.Finden Sie unter: Romain Guy ' s Erklärung
EDIT:
In #2:
- Initialisieren Sie im Konstruktor, dann rufen Sie einfach
rect.set()
in IhremonLayout()
Methode.Für #3:
- Ja, so weit ich bin mir bewusst, dass der super-Aufruf behandeln, man sollte nicht zu behandeln, es sei denn, Sie brauchen, um die Art und Weise anpassen, die Kinder sind gezeichnet.
InformationsquelleAutor der Antwort kcoppock
Wenn Sie wollen, dass die Leinwand ist neu-zeichnen invalidate aufrufen () und die Methode onDraw() wird erneut ausgeführt
InformationsquelleAutor der Antwort Stefano