Android: dibujar fondo sin GPU OverDraw como WhatsApp

Con el fin de mejorar el rendimiento de la aplicación, me encuentro con GPU Overdraw problema. De acuerdo con el artículo de Romain Guy , aquí están los colores básicos:



Para probar eso, creo un proyecto simple con XML como sigue

Código XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:layout_margin="50dp" android:background="#fff"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/hello_world"/> </RelativeLayout> 

Y obtener resultado:
N00b Me

Entonces intenté Whatsapp overdraw. Para mi sorpresa:
Impresionante whatsapp

Entonces, ¿cómo Whatsapp es dibujo papel tapiz de fondo sin overdraw (sin tinte azul), pero en mi xml simple , incluso colorear da un overdraw? ?

PS: He intencionalmente añadido color de fondo para mostrar que la adición de color da overdraw, pero la adición de fondo de pantalla no

Cada actividad tiene un fondo predeterminado Drawable que viene del atributo android:windowBackground .

WhatsApp utiliza una imagen de fondo que puede repetirse en ambas direcciones para llenar toda la pantalla. De esta manera no tienen que preocuparse con diferentes imágenes para diferentes tamaños de pantalla – es super sensible!

Así que digamos que usted tiene una imagen de mosaico (eg drawable-nodpi / background_tile.png)

Basta con crear un nuevo xml Drawable (por ejemplo drawable / background.xml) que se ve así:

 <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/background_tile" android:tileMode="repeat" /> 

Ahora simplemente establece este Drawable como fondo para el Tema de tu Actividad:

 <style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="android:windowBackground">@drawable/background</item> </style> 

También puede configurar el fondo Drawable de una actividad en runtime con getWindow().setBackgroundDrawable o getWindow().setBackgroundDrawableResource

También puede establecer el fondo Drawable a null , por ejemplo si toda la actividad muestra un MapView o algo similar.

También tenga en cuenta que el Zygote utilizará el fondo del tema Dibujable durante la fase de inicio de la aplicación si la Actividad es su actividad principal del lanzador.

Creo que el overdraw uno tiene es el fondo de su RelativeLayout . Usted puede quitar ese android:background="#fff" el fondo será dibujado una vez dependiendo del tema de la aplicación.

Aplicando la pista de Bill Gates , resulta que establecer el fondo en styles.xml en la aplicación realmente guarda un overdraw. Este código guarda un overDraw

 <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="android:windowBackground">@color/highlighted_text_material_dark</item> </style> </resources> 

Ahora la adición de fondo no toma ningún overDraw así que el Relative Layout sigue siendo un overDraw

BackGround sin OverDraw

UPDATE El método Above funciona y es bueno si desea tener el mismo color de fondo para toda su aplicación. Pero en caso de que desee diferentes colores y todavía quiera salvar OverDraw, reemplazar por encima de la línea con

 <item name="android:windowBackground">@null</item> 

Un paso mas alla
Boom .. Eres bueno para ir ..

SUGERENCIA : Si su aplicación tiene color negro como fondo .. vaya para él excepto un overdraw más;)

  • ¿Qué es EGL y GL mtrack en Android Memory Dump
  • Problema de velocidad de Android con la deserialización mediante SimpleXML
  • Java - ¿Tendrá beneficios el código inlining?
  • ¿Cómo configuro las RecyclerViews anidadas mientras permanezco en funcionamiento?
  • ¿Cómo puedo eliminar los recursos no utilizados de las bibliotecas de terceros que he incluido en Android?
  • Android - ListView con imágenes se desplaza demasiado lento incluso sin ningún procesamiento en el método getView del adaptador
  • Fondo animado con Libgdx
  • GUIs basadas en XML y rendimiento
  • Optimización de Eclipse para el desarrollo de Android
  • Trazado de dibujo de Android
  • ¿Hay alguna sobrecarga significativa en el uso de FragmentActivity sobre la actividad normal en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.