2012-04-09 8 views
5

Ich rufe getHeight und getWidth in einer benutzerdefinierten Ansicht in der onDraw() Methode. getHeight() gibt 1,073,742,549 zurück und getWidth() gibt 1,073,742,304 zurück. Wenn ich jedoch die Anzeigewerte für die Höhe und Breite des Bildschirms betrachte, erhalte ich 800 bzw. 480. Was bringt getHeight und getWidth zurück?Ansicht getHeight() und getWidth() Rückgabewerte zu groß

Ich erhalte die Dimensionen meiner Ansicht, sodass ich die Abmessungen einer Bitmap auswählen kann, die in der Ansicht angezeigt wird.

Danke.

+0

Ich bin neu auf Android, aber ich habe ähnliche Erfahrung. Es muss etwas mit der Android Version gemacht werden, da das selbe Projekt auf 4.1 gut funktioniert, aber dieses merkwürdige Verhalten auf 2.3.6 hat. Vielleicht fehlen einige Kompatibilitätseinstellungen. –

+0

Überschreiben Sie OnMeasure möglicherweise auch in Ihrer benutzerdefinierten Ansicht und rufen Sie setMeasuredDimensions mit dem Wert einer MeasureSpec.makeMeasureSpec (width, MeasureSpec.EXACTLY) auf. Ich glaube, dass die Werte, die Sie erhalten, von makeMeasureSpec mit MeasureSpec.EXACTLY zurückgegeben werden und die Dimensionen, die Sie angegeben haben. –

Antwort

10

Findest du bist Problem nicht explizit lösen sehen zu kommen, aber merkwürdig:

Width: 
1,073,742,304 == 0x400001E0 
      480 == 0x000001E0 

Height: 
1,073,742,549 == 0x400002D5 
      725 == 0x000002D5 

Jede Chance, diese benutzerdefinierte Ansicht ist ungefähr 725 x 480? Ich habe keine Ahnung, woher diese extra 0x40000000 kam, aber es sieht so aus, als könnte es fast richtig sein, außer für 1 Bit :)

+2

Danke. Das ist sehr komisch. Also bin ich die Breite und Höhe gegen 0xbfffffff Anding die richtigen Dimensionen, die funktioniert. – Jays

+1

@Jays, ich habe mir das nochmal angesehen, und ich denke, die sicherste Sache wäre 'View.MeasureSpec.getSize (getWidth())' (und auch die Höhe). Die Measurespec kann andere Dinge innerhalb dieses obersten Zeichens signalisieren, und wenn sich etwas ändert, kann es Sie später beißen (sagen Sie, wenn es 0x8000xxxx meldet). – Tim

3

Vielleicht hast du so etwas in deiner benutzerdefinierten Ansicht gemacht.

final int desiredHSpec = MeasureSpec.makeMeasureSpec(pixelHeight, MeasureSpec.MODE_CONSTANT); 
final int desiredWSpec = MeasureSpec.makeMeasureSpec(pixelWidth, MeasureSpec.MODE_CONSTANT); 
setMeasuredDimension(desiredWSpec, desiredHSpec); 

wie diese Android:Why after override onMeasure() in a custom view, the view's text can't show in RalativeLayout?

Wenn Sie es ändern in

setMeasuredDimension(width, height); 

, werden Sie einfache kleine Breite, Höhe auf OnSizeChanged() und onLayout- (get).

0

Ich hatte auch dieses Problem. Die Art, wie ich es gelöst habe, war das Überschreiben der onMeasure-Methode. Auf diese Weise hat die Ansicht immer die gleiche Größe. Zum Beispiel, wenn Sie möchten, dass die Ansicht die Größe und Breite des Bildschirms haben, sollten Sie etwas tun:

@Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     WindowManager wm = (WindowManager)this.getContext().getSystemService(Context.WINDOW_SERVICE); 
     Display display = wm.getDefaultDisplay(); 
//display.getWidth() and display.getHeight() return the screen dimensions 
     this.setMeasuredDimension(display.getWidth(), display.getHeight()); 
    } 
Verwandte Themen