5

Estoy intentando implementar la navegación deslizable (a la Facebook, Ruta de acceso o aplicaciones de Google+ para Android). La fuente completa para reproducir este error can be found here.Android WebView error de parpadeo al animar la vista en el dispositivo

Al animar WebView fuera de la pantalla, sin embargo, en un dispositivo, se produce un parpadeo, como si el dispositivo estuviera mordiendo mi WebView justo antes de sacarlo de la pantalla.

WebView slide nav menu IN (device)

El artefacto no se produce en el emulador! La animación avanza sin problemas.

WebView slide nav menu IN (emulator)

Curiosamente, este parpadeo parece ocurrir sólo cuando la vista está animada es una WebView! Aquí está el mismo proyecto que usa TextView como la vista de contenido principal.

TextView slide nav menu IN (device)

Disposición para la actividad vista web:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/blue" > 

    <WebView 
     android:id="@+id/web_content" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" /> 

</RelativeLayout> 

y para la actividad de visualización de texto:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/blue" > 

    <TextView 
     android:id="@+id/web_content" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello there. no flicker!" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     /> 

</RelativeLayout> 

Código llamada para deslizar el menú de navegación en:

private void slideIn() { 
     LinearLayout actionBarFrame = (LinearLayout) findViewById(android.R.id.content).getParent(); 

     LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
     menuView = inflater.inflate(R.layout.menu, null); 
     menuView.setLayoutParams(new FrameLayout.LayoutParams(SIZE, LayoutParams.MATCH_PARENT, Gravity.LEFT)); 
     FrameLayout decorView = (FrameLayout) getWindow().getDecorView(); 
     decorView.addView(menuView); 
     decorView.bringChildToFront(actionBarFrame); 

     FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) actionBarFrame.getLayoutParams(); 
     params.setMargins(SIZE, 0, -SIZE, 0); 
     actionBarFrame.setLayoutParams(params); 

     TranslateAnimation ta = new TranslateAnimation(-SIZE, 0, 0, 0); 
     ta.setDuration(DURATION); 
     actionBarFrame.startAnimation(ta); 
    } 

Y para colocarla de nuevo hacia fuera:

private void slideOut() { 
     LinearLayout actionBarFrame = (LinearLayout) findViewById(android.R.id.content).getParent(); 

     FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) actionBarFrame.getLayoutParams(); 
     params.setMargins(0, 0, 0, 0); 
     actionBarFrame.setLayoutParams(params); 

     TranslateAnimation ta = new TranslateAnimation(SIZE, 0, 0, 0); 
     ta.setDuration(DURATION); 
     ta.setAnimationListener(new AnimationListener() { 
      @Override 
      public void onAnimationEnd(Animation arg0) { 
       ((FrameLayout) getWindow().getDecorView()).removeView(menuView); 
       menuView = null; 
      } 
      @Override public void onAnimationRepeat(Animation arg0) { } 
      @Override public void onAnimationStart(Animation arg0) { } 
     }); 
     actionBarFrame.startAnimation(ta); 
    } 

he subido el código para BitBucket como un acuerdo de recompra pública para que pueda tratar este proyecto exactamente como yo.

¡Cualquier ayuda o idea acerca de por qué sucede esto o cómo solucionarlo sería muy apreciada! Lo que se desea es animar suavemente el WebView fuera de la imagen y volver a entrar. ¡Gracias!

+0

mismo problema aquí. @Robert encontraste una solución para esto? – jayellos

+1

@jayellos hay dos posibles soluciones a este problema. Agregaré una respuesta a continuación, pero la moraleja de la historia es que habilitar la aceleración de hardware en 'WebView' puede ayudar (no está activado por defecto en algunas plataformas), o usar [esta biblioteca] (https: // github. com/jfeinstein10/SlidingMenu) (nuestra solución actual). –

Respuesta

5

En general, parece que el problema tiene que ver con un error al usar WebViews con aceleración de hardware habilitada en dispositivos 3.0+. También intenté usar la biblioteca sliding menu con un WebView pero experimenté el mismo problema de parpadeo. Después de mirar encontré una solución aquí:

WebView “flashing” with white background if hardware acceleration is enabled (Android 3.0+)

La solución utiliza el código siguiente para establecer el tipo de capa de la WebView a la representación del software:

webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

Este código resuelve el parpadeo para mí con el inconveniente de un menor rendimiento.

+0

Puedo confirmar que la solución funciona. ¿Alguien encontró una solución que permite la aceleración de hardware? – Gibberish

Cuestiones relacionadas