5

スライドインナビゲーション(Facebook、Path、またはGoogle+のAndroidアプリ)を実装しようとしています。このバグを再現する完全なソースcan be found hereデバイスの表示をアニメートするときにAndroid WebViewのちらつきのバグが発生する

WebViewを画面からアニメーション化すると、デバイス上で、デバイスが画面から押し出す直前にWebViewのかわりにちらつきが発生しているように、ちらつきが発生します。

WebView slide nav menu IN (device)

アーティファクトは、エミュレータ上では発生しません!アニメーションは円滑に進みます。

WebView slide nav menu IN (emulator)

興味深いことに、このちらつきがアニメ化されたビューがWebViewである場合にのみ発生するようです!ここでは、メインのコンテンツビューとしてTextViewを使用する同じプロジェクトがあります。

TextView slide nav menu IN (device)

ウェブビュー・アクティビティのレイアウト:

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

とテキストビュー・アクティビティのために:

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

コードでナビゲーションメニューをスライドさせると呼ばれる:

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

アウト戻ってそれをスライドさ:

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

私が持っているとおりに、このプロジェクトを試すことができますので、私は公共のレポとしてBitBucketにコードをアップロードしました。

これがなぜ起こっているのか、それを修正する方法についての助力やアイデアは非常に高く評価されます!望むのは、WebViewを滑らかにアニメーション化して画像の外に出して戻すことです。ありがとう!

+0

ここで同じ問題が発生します。 @ロベルトあなたはこれのための解決策を見つけましたか? – jayellos

+1

@jayellosこの問題には2つの潜在的な修正があります。私は以下の答えを追加しますが、この物語の道徳は、WebViewでハードウェアアクセラレーションを有効にすると(デフォルトでは一部のプラットフォームでは有効にならない)、[このライブラリ](https:// github。 com/jfeinstein10/SlidingMenu)(現在のソリューション) –

答えて

5

一般に、WebViewsを使用して3.0+デバイスでハードウェアアクセラレーションを有効にすると、問題がバグと関係しているようです。私はまた、WebViewsliding menuライブラリを使用しようとしましたが、同じフリッカ問題が発生しました。

webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

このコードは、私のためのちらつきを解く:

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

回避策は、ソフトウェアレンダリングにWebViewの層タイプを設定するには、次のコードを使用しています。周りを探した後、私はここでの回避策を見つけましたパフォーマンスの低下という欠点があります。

+0

回避策が動作することを確認できます。誰かがハードウェアアクセラレーションを許可する解決策を見つけましたか? – Gibberish

関連する問題