2012-08-16 14 views
23

Durante l'esecuzione Android Lint sul mio progetto mi sono imbattuto in questo avvertimento"Possibile overdraw: elemento radice dipinge sfondo"

Possibile overdraw: elemento radice dipinge sfondo @ drawable/principale con un tema che dipinge anche uno sfondo

Dove tema dedotta è @android:style/Theme.NoTitleBar.Fullscreen

qualcuno può spiegarmi perché è questo andare e come rimuoverlo ??

mio 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 manifesto in cui il tema è definito

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

risposta

16

Per ottimizzare le prestazioni di applicazioni (evitare overdraw), è possibile effettuare le seguenti operazioni:

  • dichiarare un tema in 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> 
    

  • cambiamento del Manifesto:

    <application 
        android:icon="@drawable/ic_logo" 
        android:label="@string/app_name" 
        android:theme="@style/MyTheme" > 
    
  • rimuovere la dichiarazione di sfondo in "My xml"
+8

Che ne dite se ho bisogno di impostare sfondi diversi per alcune parti del app? – Franco

+2

@Franco Basta creare uno stile separato per la tua vista con l'elemento di sfondo al suo interno. Lo so, è solo una soluzione, quindi puoi semplicemente impostare gli strumenti: ignore = "Overdraw". – Ov3r1oad

+0

@Franco puoi averli in diverse attività che hanno temi diversi. –

2

Il motivo per cui si ottiene questo avvertimento lint è che la tua attività e il tuo layout lineare provano entrambi disegnare lo sfondo. Pertanto l'area visibile viene disegnata due volte.

Come eseguire il debug di questo? Esegui sdk/tools/hierarchyviewer e ispeziona la gerarchia delle viste per vedere quale vista ha lo sfondo che non è mostrato. (È necessario disporre di un dispositivo Android con ROM di sviluppo dev in esecuzione)

Che cosa è in esecuzione sotto il cofano? Nota che quasi tutti i temi Android hanno uno sfondo specificato, il che significa che se vuoi creare un "LinearLayout" che copre l'intero schermo e con un backround, è meglio impostare windowBackground = "@ null" dell'attività o rimuovere l'impostazione dello sfondo nel layout lineare.

11

Aggiornamento

Scopri i commenti o il check out this link. Come afferma Marcin, la mia soluzione qui non è un buon approccio in quanto può causare artefatti. L'ho usato per evitare di scavalcare per lungo tempo senza problemi, ma in generale potrebbe non essere un pollice di regola secondo i commenti di Chet Haase su questa tecnica.

risposta originale

L'approccio migliore che ho trovato è quello di impostare come null lo sfondo predefinito e applicare lo sfondo è necessario in ogni layout.

Il motivo è quando si imposta uno sfondo predefinito in un tema, o anche temi diversi con sfondi diversi come suggerito sopra, questo significa che l'intero layout sarà riempito con quello sfondo. Nella maggior parte dei casi non hai bisogno di uno sfondo che riempia il 100% dello schermo perché hai barre degli strumenti, intestazioni, piè di pagina e altri elementi in cima a quello sfondo che causeranno il superamento.

Per applicare sfondo nullo su un tema:

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

Per controllare overdraw basta attivare l'opzione Mostra overdraw nelle opzioni dev sul tuo emulatore/dispositivo. Non fidarti del 100% di avvertenze sui lanugine perché c'erano alcuni bug nel tracker che non sono sicuro siano stati corretti.

Maggiori informazioni: What is overdraw and why is an issue?

+0

Questa è una buona linea di ragionamento che presenti qui , ma per favore controlla la sezione "Evita sfondi Null" in [Sviluppo per Android VIII Regole: Interfaccia utente] (https://medium.com/google-developers/developing-for-android-viii-e91ced595fac) per possibili inconvenienti di questo approccio. –

+0

@Marcin Kozinski Grazie, hai ragione. – Sotti

+0

@Marcin Altho con la raccomandazione di Chet (usa lo sfondo predefinito) è più difficile evitare il sovrascrittura su barre degli strumenti e altri elementi di layout poiché lo sfondo corrisponderà sempre alle dimensioni dello schermo intero. – Sotti

Problemi correlati