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:
-
Ningún color significa que no hay sobregiro . El píxel fue pintado sólo una vez. En este ejemplo, puede ver que el fondo está intacto.
-
El azul indica un sobregiro de 1x. El píxel fue pintado dos veces. Las grandes áreas azules son aceptables (si toda la ventana es azul, puede deshacerse de una capa).
- Verde indica un sobregiro de 2x. El píxel fue pintado tres veces. Las áreas verdes medianas son aceptables pero usted debe intentar optimizarlas lejos.
- Rojo claro indica un sobregiro de 3x. El píxel fue pintado cuatro veces. Pequeñas áreas de color rojo claro son aceptables.
- El rojo oscuro indica un sobregiro de 4x o más. El píxel fue pintado 5 veces o más. Esto está mal. Arreglarlo
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:
Entonces intenté Whatsapp overdraw. Para mi sorpresa:
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
- Qué orden de diseños anidados es más eficiente en Android
- Android: nesting FrameLayouts - ¿cuál es la sobrecarga de rendimiento exacto?
- ¿Cuál es la tasa de bits de lectura NFC efectiva usando comandos de APDU?
- Android ViewPager y TabLayout no funcionan rápido
- Colores de las barras GPU de perfil en Android M
- El objeto se convierte en nulo
- ¿Cuál es la mejor solución para un salto de barra de progreso indeterminado en ICS?
- Es SharedPreferences tiempo de acceso?
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
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>
Boom .. Eres bueno para ir ..
SUGERENCIA : Si su aplicación tiene color negro como fondo .. vaya para él excepto un overdraw más;)
- Obtener el inicio de la semana y la fecha de finalización del número de la semana y del año en android
- Android SQLite Eliminar fila de la tabla Donde 2 Argumentos