5

Próbuję zaimplementować nawigację po slajdzie (a la Facebook, ścieżka lub aplikacje Google+ na Androida). Kompletne źródło do odtworzenia tego błędu can be found here.Błąd przeglądarki WebView z migotaniem podczas animowania widoku na urządzeniu

Podczas animowania ekranu WebView na ekranie migotanie pojawia się tak, jakby urządzenie zaczęło odgryźć mój telefon WebView tuż przed zepchnięciem go z ekranu.

WebView slide nav menu IN (device)

Artefakt nie występuje na emulatorze! Animacja przebiega płynnie.

WebView slide nav menu IN (emulator)

Co ciekawe, to migotanie wydaje się występować tylko wtedy, gdy widok jest animowana jest WebView! Oto ten sam projekt, w którym TextView jest głównym widokiem treści.

TextView slide nav menu IN (device)

Layout dla aktywności zobaczyć 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> 

A dla aktywności widoku tekstu:

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

kodu zwanego przesuwać menu nawigacyjnego w:

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

I przesuń go z powrotem na zewnątrz:

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

wysłał kod do BitBucket jako publiczne repo więc można spróbować tego projektu dokładnie jak ja.

Każda pomoc lub pomysł na temat tego, dlaczego tak się dzieje lub jak to naprawić, byłby bardzo doceniony! Pożądane jest płynne animowanie obrazu WebView z powrotem. Dzięki!

+0

ten sam problem tutaj. @Robert, czy znalazłeś rozwiązanie? – jayellos

+1

@jayellos Istnieją dwa potencjalne poprawki tego problemu. Dodam odpowiedź poniżej, ale morał tej historii polega na tym, że włączenie przyspieszenia sprzętowego w 'WebView' może pomóc (domyślnie nie jest włączone na niektórych platformach) lub przy użyciu [tej biblioteki] (https: // github. com/jfeinstein10/SlidingMenu) (nasze obecne rozwiązanie). –

Odpowiedz

5

Wygląda na to, że problem związany jest z błędem podczas używania WebViews z akceleracją sprzętową włączoną na urządzeniach z 3.0+. Próbowałem również korzystać z biblioteki sliding menu z WebView, ale wystąpił ten sam problem z migotaniem. Po rozglądając znalazłem obejście tutaj:

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

Obejście wykorzystuje następujący kod, aby ustawić typ warstwy WebView renderowania oprogramowanie:

webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

Ten kod rozwiązać migotanie dla mnie z wadą niższej wydajności.

+0

Mogę potwierdzić, że to obejście działa. Czy ktoś znalazł rozwiązanie, które pozwala przyspieszyć sprzęt? – Gibberish

Powiązane problemy