Android: Zeichnen auf die Leinwand und die Ansicht (ohne Bitmap)
-
25-10-2019 - |
Frage
Ich habe das Kind von Relatelayout erstellt. In seinem Konstruktor rief ich an:
public CanvasHolder(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(R.layout.canvas_holder, this);
this.draw(new Canvas());
}
Und überschreiben Sie die Methode ONDRAW ():
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
black.setARGB(255, 0, 0, 0);
black.setAntiAlias(true);
int halfWidth = this.getWidth() / 2;
int height = this.getHeight();
canvas.drawLine(0, 0, halfWidth, height, black);
}
Auf der Ansicht wurde keine Zeile erschienen. Außerdem habe ich versucht, "this.draw ()" nicht zu nennen, aber nichts passierte.
Ich habe entdeckt, dass die Halbbreite und die Höhe gleich 0 sind. Warum?
PS Auch wenn ich Breite und Höhe statisch festlegt, wird sich nichts ändern. Wenn es Ihnen nichts ausmacht, schauen Sie sich diese Beispielanwendung an: Warum wird nichts gezeichnet?http://androidforums.com/attachment.php?attachmentID=21715&stc=1&d=1315232946
Lösung 2
Ich habe eine nicht triviale Lösung gefunden. Ich habe die Ansicht durch den Konstruktor mit 1 Parameter initiert. Und dann habe ich die benutzerdefinierte Ansicht in das Layout eingefügt und aufgerufen () (), wenn ich sie brauchte.
Andere Tipps
Hast du das überschrieben? onMeasure
? Hier ist meins - Sie können feststellen, dass dies ein paar Mal aufgerufen wird, während die Ansicht geladen wird, manchmal mit 0 Werten:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
if (parentHeight > 0) {
this.setMeasuredDimension(parentWidth, parentHeight);
// ... other stuff ...
}
}