2012-08-16 9 views
23

Podczas systemem Android Lint na mój projekt natknąłem tego ostrzeżenia„Możliwe Overdraw: element główny maluje tło”

Możliwa Overdraw: element główny maluje tło @ odkształcalne/main z temat, który również maluje tło

Gdzie wywnioskować tematem jest @android:style/Theme.NoTitleBar.Fullscreen

Czy ktoś może mi wyjaśnić, dlaczego jest to nadchodzi i jak go usunąć ??

Moje 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" > 

Część manifeście gdzie tematem jest zdefiniowana

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

Odpowiedz

16

Aby zoptymalizować wydajność aplikacje (unikać Overdraw), można wykonać następujące czynności:

  • zadeklaruj motyw w 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> 
    

  • zmiana Manifest:

    <application 
        android:icon="@drawable/ic_logo" 
        android:label="@string/app_name" 
        android:theme="@style/MyTheme" > 
    
  • usunąć deklarację tła w "Moje xml"
+8

Jak o tym, czy muszę ustawić różnych środowisk dla niektórych częściach aplikacji? – Franco

+2

@Franco Po prostu utwórz osobny styl dla widoku z elementem tła. Wiem, to tylko obejście, więc możesz po prostu ustawić narzędzia: ignore = "Overdraw". – Ov3r1oad

+0

@Franco możesz mieć je w różnych działaniach, które mają różne motywy. –

2

Powodem dostać to ostrzeżenie niestrzępiącą jest to, że twoja aktywność i układ liniowy starają się narysuj tło. Dlatego widoczna powierzchnia jest narysowana dwukrotnie.

Jak to debugować? Uruchom sdk/tools/hierarchyviewer i sprawdź hierarchię widoków, aby zobaczyć, które widok ma tło, które nie jest wyświetlane. (Musisz mieć urządzenie z Androidem, na którym działa dev build)

Co się dzieje pod maską? Pamiętaj, że prawie wszystkie motywy z Androidem mają określone tło, co oznacza, że ​​jeśli chcesz utworzyć "LinearLayout", który obejmuje cały ekran i backround, lepiej albo ustaw działanie windowBackground = "@ null" lub usuń ustawienie tła w układzie liniowym.

11

Aktualizacja

Zapoznaj się z komentarzy lub sprawdzić this link. Jak wspomina Marcin, moje rozwiązanie tutaj nie jest dobrym podejściem, ponieważ może powodować artefakty. Używałem go, aby uniknąć nadmiernego przeciągania przez długi czas bez żadnych problemów, ale generalnie może to nie być kciuk reguły zgodnie z komentarzami Cheta Haase'a na temat tej techniki.

odpowiedź Original

Najlepszym rozwiązaniem znalazłem jest ustawiony jako domyślny pustego tła i zastosować tło trzeba w każdym układzie.

Powodem jest ustawienie domyślnego tła w motywie, a nawet różnych motywów z różnymi kolorami, jak zasugerowano powyżej, oznacza to, że cały układ zostanie wypełniony tym tłem. W większości przypadków nie potrzebujesz tła wypełniającego 100% ekranu, ponieważ masz paski narzędzi, nagłówki, stopki i inne elementy na górze tego tła, które spowodują overdraw.

Aby zastosować zerową tła na temat:

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

Aby sprawdzić overdraw wystarczy uaktywnić opcję Pokaż Overdraw w opcjach dev na swojej emulatora/urządzenia. Nie ufaj 100% ostrzeżeniom lint, ponieważ niektóre błędy w trackerze, których nie jestem pewien, są całkowicie poprawione.

Więcej informacji: What is overdraw and why is an issue?

+0

To dobra linia rozumowania, którą tu prezentujesz , ale proszę sprawdzić sekcję "Unikam okien z pustym oknem" w [Opracowanie dla Androida VIII Reguły: Interfejs użytkownika] (https://medium.com/google-developers/developing-for-android-viii-e91ced595fac) dla możliwe wady tego podejścia. –

+0

@Marcin Kozinski Dzięki, masz rację. – Sotti

+0

@Marcin Altho z zaleceniem Cheta (użyj domyślnego tła) jest trudniej uniknąć overdraw na paskach narzędzi i innych elementach układu, ponieważ tło będzie zawsze pasowało do całego rozmiaru ekranu. – Sotti