5

Ich versuche die Einschubnavigation zu implementieren (a la Facebook, Path oder Google+ Android Apps). Die vollständige Quelle, um diesen Fehler zu reproduzieren can be found here.Android WebView Flicker Bug beim Animieren der Ansicht auf dem Gerät

Bei der Animation eines WebView auf dem Bildschirm erscheint jedoch auf einem Gerät ein Flackern, als ob das Gerät gerade aus meinem WebView herausbeißt, bevor es vom Bildschirm weggedrückt wird.

WebView slide nav menu IN (device)

Das Artefakt auf dem Emulator nicht auftritt! Die Animation verläuft reibungslos.

WebView slide nav menu IN (emulator)

Interessanterweise scheint das Flimmern nur auftreten, wenn die Ansicht eine WebView ist animiert werden! Hier ist das gleiche Projekt, das TextView als Hauptinhaltsansicht verwendet.

TextView slide nav menu IN (device)

Layout für die Webansicht Aktivität:

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

Und für die Textansicht Aktivität:

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

-Code genannt in das Navigationsmenü gleiten:

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); 
    } 

Und es wieder heraus zu schieben:

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); 
    } 

ich den Code zu BitBucket als öffentlicher Repo hochgeladen, so dass Sie dieses Projekt können versuchen, genau wie ich.

Jede Hilfe oder Ideen, warum dies geschieht oder wie es zu beheben wäre sehr dankbar! Was gewünscht ist, ist die WebView aus dem Bild und wieder rein animieren. Danke!

+0

gleiche Frage hier. @Robert hast du eine Lösung dafür gefunden? – jayellos

+1

@jayellos es gibt zwei mögliche Fixes für dieses Problem. Ich füge unten eine Antwort hinzu, aber die Moral der Geschichte ist, dass die Aktivierung der Hardwarebeschleunigung auf dem 'WebView' helfen kann (es ist auf einigen Plattformen nicht standardmäßig aktiviert) oder [this library] (https: // github. com/jfeinstein10/SlidingMenu) (unsere aktuelle Lösung). –

Antwort

5

Im Allgemeinen scheint das Problem mit einem Fehler zu tun, wenn WebViews mit Hardwarebeschleunigung auf 3.0+ Geräten aktiviert ist. Ich versuchte auch, die sliding menu Bibliothek mit einer WebView zu verwenden, aber erfuhr das gleiche Flackerproblem. Nach etwas fand ich eine Abhilfe hier:

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

Die Abhilfe verwendet den folgenden Code, um den Schichttyp der WebView zu Software-Rendering zu setzen:

webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

Dieser Code das Flimmern für mich gelöst mit dem Nachteil der geringeren Leistung.

+0

Ich kann bestätigen, dass die Problemumgehung funktioniert. Hat jemand eine Lösung gefunden, die eine Hardwarebeschleunigung zulässt? – Gibberish

Verwandte Themen