2014-02-24 3 views
5

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

Antwort

2

Im onDraw, ist alles auf die Leinwand relativ - aber es scheint, dass Sie alles, was nach Ansicht Positionen zeichnen, die durch in onLayout kommen, die die relative sind Bildschirm.

für die rechte Hand Bild Also, müssen Sie eigentlich die X-Position wie folgt berechnen:

checkX = right - left - check.getWidth(); 

Sie werden wahrscheinlich auch feststellen, dass die linke Hand Bild ein wenig eingezogen wird, wenn die Eltern jeder hat padding so versuchen sie es bei 0 Positionierung:

calendarX = 0; 
1

Sie können über folgenden Weg Padding erhalten:

Und
ViewParent parent = getParent(); 
int topPadding = 0; 
int bottomPadding = 0; 

if (parent instanceof ViewGroup) { 
    topPadding = ((ViewGroup) parent).getPaddingTop(); 
    bottomPadding = ((ViewGroup) parent).getPaddingBottom(); 
} 

verwenden es:

parentHeight -= topPadding - bottomPadding; 
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; 
} 
+0

Keine Notwendigkeit für "parent = null" zu überprüfen. Da es trivialerweise von instanceof operator verwaltet wird. –

+0

Guter Punkt, Sir. – Niko

+0

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