2012-04-09 7 views
5

Llamo a getHeight y getWidth en una vista personalizada en el método onDraw(). getHeight() devuelve 1,073,742,549 y getWidth() devuelve 1,073,742,304. Sin embargo, cuando miro las métricas de la pantalla para la altura y el ancho de la pantalla, obtengo 800 y 480 respectivamente. ¿Qué devuelve getHeight y getWidth?Ver getHeight() y getWidth() valores de retorno demasiado grandes

Obtengo las dimensiones de mi vista para poder elegir las dimensiones de un mapa de bits que irá en la vista.

Gracias.

+0

Soy nuevo en Android, pero tengo una experiencia similar. Tiene que hacer algo con la versión de Android, ya que el mismo proyecto funciona bien en 4.1, pero tiene este extraño comportamiento en 2.3.6. Tal vez falten algunas configuraciones de compatibilidad. –

+0

¿Quizás también esté anulando onMeasure en su vista personalizada y llamando a setMeasuredDimensions con el valor de MeasureSpec.makeMeasureSpec (width, MeasureSpec.EXACTLY)? Creo que los valores que está obteniendo se devolverán desde makeMeasureSpec con MeasureSpec.EXACTLY y las dimensiones que ha especificado. –

Respuesta

10

no resuelve explícitamente estás problema, pero curiosamente:

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

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

¿Alguna posibilidad de que esta vista personalizada sea de aproximadamente 725 x 480? No tengo idea de dónde vino ese 0x40000000 extra, pero parece que podría ser casi correcto, excepto por 1 bit :)

+2

Gracias. Eso es muy raro. Así que estoy anding el ancho y alto contra 0xbfffffff para obtener las dimensiones correctas, que funciona. – Jays

+1

@Jays, miré esto de nuevo, y creo que lo más seguro sería 'View.MeasureSpec.getSize (getWidth())' (y height también). La measurepec puede señalar otras cosas dentro de ese personaje principal, y si algo cambia, puede morderte más tarde (por ejemplo, si informa 0x8000xxxx). – Tim

3

Tal vez, hiciste algo como esto en tu vista personalizada.

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

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

Si cambia en

setMeasuredDimension(width, height); 

, obtendrá poca anchura sencilla, la altura de su onSizeChanged() y OnLayout().

0

También tuve este problema. La forma en que lo resolví fue anular el método onMeasure. De esta manera, la vista siempre tiene el mismo tamaño. Por ejemplo, si desea que la vista tenga el tamaño y el ancho de la pantalla, debe hacer algo como esto:

@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()); 
    } 
Cuestiones relacionadas