2012-08-16 63 views
23

Mientras se ejecuta Android pelusa en mi proyecto me encontré con esta advertencia"overdraw Posible: Elemento Raíz pinta fondo"

Posible overdraw: Elemento Raíz pinta fondo @ estirable/principal con un tema que también pinta un fondo

Cuando el tema es inferida @android:style/Theme.NoTitleBar.Fullscreen

puede alguien explicarme por qué es este ir y cómo quitarlo ??

Mi xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@drawable/main" //***LINT warning*** 
     android:orientation="vertical" 
     android:weightSum="3" > 

La parte del manifiesto, donde el tema se define

<application 
     android:icon="@drawable/ic_logo" 
     android:label="@string/app_name" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > 

Respuesta

16

Para optimizar el rendimiento de aplicaciones (evitar el sobregiro), puede hacer lo siguiente:

  • declarar un tema en res/values/styles.xml

    <style name="MyTheme" parent="android:Theme"> 
        <item name="android:background">@drawable/main</item> 
        <item name="android:windowNoTitle">true</item> 
        <item name="android:windowFullscreen">true</item> 
    </style> 
    

  • cambio del Manifiesto:

    <application 
        android:icon="@drawable/ic_logo" 
        android:label="@string/app_name" 
        android:theme="@style/MyTheme" > 
    
  • eliminar la declaración de fondo en "Mi xml"
+8

¿Qué tal si necesito establecer diferentes fondos para algunas partes de la aplicación? – Franco

+2

@Franco Simplemente cree un estilo separado para su vista con el elemento de fondo en él. Lo sé, es solo una solución, así que puedes simplemente configurar las herramientas: ignorar = "Sobregrabar". – Ov3r1oad

+0

@Franco puede tenerlos en diferentes actividades que tienen diferentes temas. –

2

La razón por la que recibe esta advertencia pelusa es que tu actividad y tu diseño lineal intentan dibuja el fondo. Por lo tanto, el área visible se dibuja dos veces.

¿Cómo se solucionó esto? Ejecute sdk/tools/hierarchyviewer e inspeccione la jerarquía de vistas para ver qué vista tiene el fondo que no se muestra. (Necesita tener un dispositivo Android que ejecute dev build rom)

¿Qué se está ejecutando bajo el capó? Tenga en cuenta que casi todos los temas de Android tienen antecedentes especificados, lo que significa que si alguna vez desea crear un "LinearLayout" que cubra toda la pantalla y con un fondo, será mejor que establezca windowBackground = "@ null" o elimine la configuración de fondo en el diseño lineal.

11

actualización

ver los comentarios o echa un vistazo this link. Como Marcin menciona, mi solución aquí no es un buen enfoque ya que puede causar artefactos. Lo he estado utilizando para evitar el sobregiro durante mucho tiempo sin ningún problema, pero en general podría no ser un pulgar de la regla según los comentarios de Chet Haase sobre esta técnica.

Respuesta original

El mejor método que he encontrado es fijar como nulo el fondo predeterminado y aplicar el fondo que necesita en cada diseño.

El motivo es cuando configura un fondo predeterminado en un tema, o incluso diferentes temas con fondos diferentes, tal como se sugirió anteriormente, esto significa que el diseño completo se llenará con ese fondo. En la mayoría de los casos, no necesita un fondo que llene el 100% de la pantalla porque tiene barras de herramientas, encabezados, pies de página y otros elementos sobre ese fondo que causarán sobregiro.

Para aplicar nula fondo sobre un tema:

<style 
    name="ThemeName" parent="ParentTheme"> 
    <item name="android:windowBackground">@null</item> 
</style> 

Para comprobar girar en descubierto basta con activar la opción Mostrar girar en descubierto en las opciones dev en el emulador/dispositivo. No confíes en las advertencias 100% pelusa porque hubo algunos errores en el rastreador que no estoy seguro de que estén completamente corregidos.

Más información: What is overdraw and why is an issue?

+0

Esa es una buena línea de razonamiento que presenta aquí , pero consulte la sección "Evitar fondos de ventana nulos" en [Desarrollo de Android VIII Las reglas: Interfaz de usuario] (https://medium.com/google-developers/developing-for-android-viii-e91ced595fac) para posibles inconvenientes de este enfoque. –

+0

@Marcin Kozinski Gracias, tienes razón. – Sotti

+0

@Marcin Altho con la recomendación de Chet (use el fondo predeterminado) es más difícil evitar el sobregiro en las barras de herramientas y otros elementos del diseño, ya que el fondo siempre coincidirá con el tamaño de pantalla completa. – Sotti

Cuestiones relacionadas