2012-06-08 6 views
9

Probé con este¿Por qué lienzo no es del mismo tamaño que ver en onDraw? (Android)

@Override 
protected void onDraw(Canvas canvas) 
{ 
    Log.e("TEST", "canvas width: " + canvas.getWidth() + ""); 
    Log.e("TEST", "view width: " + this.getWidth() + ""); 

    Log.e("TEST", "canvas height: " + canvas.getHeight() + ""); 
    Log.e("TEST", "view height: " + this.getHeight() + ""); 
    super.onDraw(canvas); 
    Log.e("TEST", "canvas width: " + canvas.getWidth() + ""); 
    Log.e("TEST", "view width: " + this.getWidth() + ""); 

    Log.e("TEST", "canvas height: " + canvas.getHeight() + ""); 
    Log.e("TEST", "view height: " + this.getHeight() + ""); 
} 

Y este es el resultado:

canvas width: 320 
view width: 480 
canvas height: 533 
view height: 300 
canvas width: 320 
view width: 480 
canvas height: 533 
view height: 300 

Parte de mi main.xml

android:layout_width="480px" 
    android:layout_height="300px" 

Según mis impresiones de registro y parte de mi xml, el tamaño de la vista es correcto. Mi dispositivo es 480x800 y tanto el ancho como la altura divididos por Log results dan 1.5 (800/533 = 1.5 y 480/320 = 1.5), por lo que parece que obtengo Canvas de toda la pantalla para dibujar. ¿Por qué es esto, y por qué es tan pequeño y qué debo hacer para dibujar de manera normal?

Respuesta

14

SuitUp,

El objeto canvas vista gestionados probablemente siempre será diferente de su tamaño de pantalla. Mucho depende de qué objeto está utilizando la lógica anterior. La razón de esto es que Android crea un nuevo lienzo o reutiliza el anterior dependiendo de cómo se representan sus padres e hijos y en qué parte del ciclo de procesamiento se está llamando. Las cosas se ponen aún más extraño cuando se anular el comportamiento y cambiar los puntos de vista de forma dinámica (sobre todo si lo hace durante el ciclo de medida empate diseño//.

¿Por qué es esto, y por qué es tan pequeño ...

El tamaño del lienzo se basa en los parámetros de diseño del objeto en el que se encuentra. Si invalida onMeasure o onLayout, el lienzo solo reajustará lo que sea necesario para reajustar. Si tiene problemas con el tamaño del lienzo, realmente quiero ver sus parámetros de diseño para la vista que está dibujando. A veces será más grande y, a veces será más pequeño. Solo tendrá el mismo tamaño que la pantalla en un nivel superior./ViewGroup que tiene match_parent (o fill_parent) para layout_width y layout_height en una actividad que es pantalla completa (sin barra de notificaciones) y no utiliza el estilo Theme.Dialog.

... ¿qué debo hacer para dibujar de la manera normal?

Eso depende de lo que quiera decir con normalidad y cuáles son sus necesidades. Si está tratando de administrar la interfaz de usuario completa manualmente, debe tomar el control del objeto de nivel superior. Esto normalmente se hace extendiendo la vista de nivel superior para que pueda anular el comportamiento. Los lanzadores hacen esto anulando el FrameLayout de nivel superior y luego sus vistas secundarias. Eso sí, puede ser costoso, ya que PUEDE sacar cosas de la pantalla si tiene un lienzo lo suficientemente grande.

Los programas MOST utilizan vistas secundarias y simplemente anulan la forma en que dibujan, entendiendo que una Vista secundaria no debe controlar la forma en que dibuja una Vista principal. En este caso, el lienzo es pequeño y limitado, pero optimiza la lógica y permite que el objeto se mueva en consecuencia a la vez que se mantiene la representación estable.

Los juegos utilizan una pantalla completa SurfaceView para satisfacer sus necesidades. Esto proporciona un lienzo muy flexible con priorización en el manual y una presentación en constante cambio. Hay una serie de ejemplos y tutoriales que muestran cómo hacerlo. Simplemente busque en Google por SurfaceView.

En general, para la mayoría de Vistas, los métodos de representación y dibujo predeterminados se pueden utilizar en su naturaleza orientada a objetos. La utilización adecuada de funciones como onMeasure y onLayout a menudo logra los resultados deseados. Sin saber más acerca de sus necesidades particulares, este es el mejor consejo que se le puede dar.

Más información (seguro acerca de la relevancia)

La comprensión de cómo Android hace Vistas pueden ser cruciales para el logro de los resultados deseados. Tanto ha entrado en el motor que debe dar cuenta de múltiples pantallas, y diferentes formas de renderizar la misma Vista dados muchos parámetros diferentes. Investigaría cómo utilizar los parámetros de diseño para reducir la cantidad de trabajo que tienes que hacer. Además, hay mucha información sobre las relaciones entre onMeasure, onLayout y onDraw. En muchas circunstancias, simplemente aplicar los parámetros correctos a las Vistas correctas hará una gran diferencia en la cantidad de control que debe tomar para renderizar su objeto correctamente.

Espero que esto ayude,

FuzzicalLogic

Cuestiones relacionadas