Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


La imagen de fondo de Android ralentiza la aplicación

Estoy usando un viewpager para pasar entre fragmentos en mi aplicación. Defino el fondo en el XML, así que

android:background="@drawable/bg_final" 

Si uso un simple color de fondo, mi aplicación funciona muy bien. Si lo uso con esta imagen de fondo, fps disminuye y mi aplicación sólo se vuelve aceptable. No es lento, simplemente no tan suave, sin embargo en los dispositivos más débiles podría trabajar laggy. ¿Es una mala forma de aplicar una imagen de fondo? La imagen entera es un png de 480×800 con el tamaño de 14.7kB. ¿Cuál podría ser el problema?

  • Dibujar sobre la barra de navegación (y otras aplicaciones) en la versión de Android> = 5
  • Ocultación de la barra de acción contextual mientras el cajón de navegación está abierto
  • Cómo agregar un elemento a un grupo de menús en NavigationView
  • ¿Cómo buscar información de usuario de Google GAIA ID?
  • Suscribir un cajón de navegación a un Observable
  • El modo inmersivo pegajoso está deshabilitado después de mostrar el teclado virtual
  • (Los fondos de los fragmentos son transparentes, el viewpager está en un main.xml que tiene su fondo con esta imagen)

  • Loader entrega el resultado al fragmento incorrecto
  • ViewPager en ScrollView
  • Texto en PagerTabStrip no se muestra en la primera vista
  • Ocultar Soft Keyboard en la aplicación para Android Desde fragmentos de ViewPager
  • (ActionBar) Tabs + Pager + detail Fragmentos dentro del contenedor ViewPager
  • Cómo acceder al valor de edittext dentro de fragmento que está en un viewpager
  • 6 Solutions collect form web for “La imagen de fondo de Android ralentiza la aplicación”

    Hay un montón de respuestas que apuntan a pre-escala de su mapa de bits. Esto es muy importante y deberías hacerlo si puedes, sin embargo después de intentar varias cosas diferentes, la mayor ganancia de rendimiento que experimenté fue crear una vista y sobreescribir el método onDraw.

    La clase podría ser tan simple como esto:

     public class DTImageView extends View { public Bitmap imageBitmap; public DTImageView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(imageBitmap != null) canvas.drawBitmap(imageBitmap, 0, 0, null); } } 

    Invoque el código utilizando un mapa de bits previamente escalado:

      DTImageView bgImageView = new DTImageView(context); bgImageView.imageBitmap = Bitmap.createScaledBitmap(bitmap,width,height,true); 

    En este punto, puede agregar esta vista a la jerarquía de vistas a la que pertenece. En mi caso, mi jerarquía de vista tenía una bgImage, un medio donde todas las otras funcionalidades ocurrieron y fgImage.

    Utilice la herramienta sdk de Android Viewer de Jerarquía para perfilar la aplicación y ver la velocidad que cada vista está tomando para dibujar. Mi aplicación pasó 30-40ms dibujando el bgImage y fgImage. Pre-escalado y sobreescritura onDraw reducido que 30-40ms a cerca de 1,5ms.

    Esta es una captura de pantalla del rendimiento de Draw para una de mis vistas antes y después:

    ANTES DE: Utilizar setImageBitmap en lugar de sobrescribir onDraw.

    DESPUÉS: Utilizando el anterior DTImageView que simplemente anula OnDraw

    Estoy un poco tarde, pero esto sólo me mordió, y al ejecutar el depurador de GPU, me di cuenta de que el sistema aumentó mi imagen! ¡Tenía una imagen 1920×1080, y apareció como una textura 3780×6720!

    Idealmente, debe tener texturas para cada densidad en la carpeta respectiva ( res/drawable-mdpi , res/drawable-hdpi , etc).

    Sin embargo, si crees que tu textura está bien, ponla en res/drawable-nodpi , no res/drawable . Si lo coloca en res/drawable-nodpi , el sistema no lo escalará basándose en el dpi.

    En mi caso, cambió una interfaz de usuario simple de 10fps en un Pixel XL a la velocidad de fotogramas completa de 60fps.

    Tenía una imagen de fondo, no grande en tamaño, pero con dimensiones extrañas – por lo tanto, el estiramiento y el mal desempeño. Hice un método con los parámetros Contexto, una Vista y un identificador (int) que puede coincidir con el tamaño de la pantalla del dispositivo. Utilice esto en, por ejemplo, un fragmento onCreateView para establecer el fondo.

     public void setBackground(Context context, View view, int drawableId){ Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableId); int width = Resources.getSystem().getDisplayMetrics().widthPixels; int height = Resources.getSystem().getDisplayMetrics().heightPixels; bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true); BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), bitmap); view.setBackground(bitmapDrawable); } 

    La razón de esto podría ser que la imagen se está estirando, y Android tiene problemas de rendimiento con el estiramiento de imágenes de fondo.

    En su lugar, debe sustituir la imagen de fondo con un color de fondo o ver esta respuesta para que la imagen se repita en lugar de estiramiento.

    Tuve el mismo problema y lo resolví mediante este método:

    Agregue su imagen a la carpeta mipmap que se encuentra en el directorio res . Se agregará la imagen de acuerdo a su densidad.

    Crear agregar sólo una imagen de fondo con tamaño 1080×1920 y ponerlo en la carpeta drawable-nodpi y que resolvió este problema

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.