Ich versuche, eine benutzerdefinierte Ansicht zu zeichnen, ist alles Rendering in Ordnung, mit Ausnahme des am weitesten rechts stehenden Teil wird abgeschnitten. Ich möchte, dass die Ansicht den Elternteil füllt und nur die benötigte Höhe verwendet (dh die Höhe der Bitmap, die ich zeichne. Wenn ich das Padding aus dem XML-Layout der Aktivität entferne, wird die benutzerdefinierte Ansicht gerendert. Also ich nicht Berechnung onMeasure mit den Eltern zu berücksichtigen PolsterungAndroid Custom wie onMeasure berechnen Eltern zu füllen
Bitte jemand einen Blick auf diesen Code nehmen und beschreiben, warum und wie ich falsch gehe Dank
EDITED @ Antwort nicko ist enthalten und detaillierter.?
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
ViewParent parent = getParent();
int leftPadding = 0;
int rightPadding = 0;
if (parent instanceof ViewGroup) {
leftPadding = ((ViewGroup) parent).getPaddingLeft();
rightPadding = ((ViewGroup) parent).getPaddingRight();
}
float wanabeHeight = calendar.getHeight();
float wanabeWidth = parentWidth - leftPadding - rightPadding;
int height = 0;
//Determine Height
switch(heightMode){
case MeasureSpec.EXACTLY: height = parentHeight;
break;
case MeasureSpec.AT_MOST:
height = Math.min((int)wanabeHeight, parentHeight);
break;
case MeasureSpec.UNSPECIFIED:
default:
height = (int)wanabeHeight;
break;
}
setMeasuredDimension((int)wanabeWidth, height);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
calendarX = left;
personX = (int)((right - left) * 0.5);
checkX = right - check.getWidth() - getPaddingRight();
lineY = (int)((bottom - top) * 0.5);
bitmapY = (int)(((bottom - top) * 0.5) - (calendar.getHeight() * 0.5));
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(calendar, calendarX, bitmapY, paint);
canvas.drawBitmap(person, personX, bitmapY, paint);
canvas.drawBitmap(check, checkX, bitmapY, paint);
canvas.drawLine((calendarX + calendar.getWidth() + PADDING), lineY, personX - PADDING, lineY, linePaint);
canvas.drawLine((personX + person.getWidth() + PADDING), lineY, checkX - PADDING, lineY, linePaint);
}
Keine Notwendigkeit für "parent = null" zu überprüfen. Da es trivialerweise von instanceof operator verwaltet wird. –
Guter Punkt, Sir. – Niko
Heya, habe ich versucht, dies jedoch die richtige Bitmap (check) wird noch abgeschnitten. Ich änderte Ihre Antwort die Mutterbreite anzupassen, anstatt Höhe (als die rechte Seite abgeschnitten zu werden). I berechnen checkX in onLayout-() und ziehen die Bitmap 'Check' in OnDraw. – serenskye