2015-09-10 14 views
7

ながら、オーバーレイナビゲーションバーは、画面上に示すように、また shared elements overlay navigation bar共有要素は、遷移アニメーションでナビゲーションバーをオーバーフロー

あなたはこのバグを見ることができる新しい活動中の画面を超える場所他、共有要素に活動トランジット1、あなたが活動のテーマに

<item name="android:windowDrawsSystemBarBackgrounds">true</item> 

を使用するときに私が見つけた

+1

このビデオはプライベートであるためにこれを参照することができます。これらのビューへの参照を取得するには、次のコードを使用することができます。 :):P –

+0

質問を投稿する前に答えを知っていると思います。 –

+0

ありがとうございます。私はビデオへのアクセスを変更しました。 –

答えて

0

ビデオview overlay navigation barで、それは、Androidのバグです。

は、しかし、それはステータスバーに色を設定する必要があるので、私はこれをfalseに設定することができませんでした。それ以外の場合はまた、あなたがWindowさんclearFlagsメソッドを介してこのフラグをクリアすることができます

if (Build.VERSION.SDK_INT >= 21) { 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
} 

を経由して、実行時に、このフラグを設定することが可能です。

それから私は、第二の活動のスタートトランジションアニメーションの前にこのフラグをクリアし、移行が完了した後、このフラグを追加します。それは、呼び出されたアクティビティでのみ行う必要があります。

UPDATE

私はより良い解決策を見つけました。 Androidでは、すべての共有要素ビューが装飾ビューの上に描画されます。ナビゲーションバーの背景は、通常、装飾ビューの上に置かれます。しかし、移行時代には共有要素が高くなります。

navigationBarBackgroundビューがgetWindow().getDecorView().findViewById(android.R.id.navigationBarBackground)からアクセス可能な要素を、共有するために追加可能です。このためには、アクティビティを呼び出す際に共有要素に追加し、呼び出されたアクティビティの共有要素に追加する必要があります。

問題が1つあります。ナビゲーションビューが装飾ビューに添付されるのを待つ必要があります。また、これは意志

getWindow().setEnterTransition(null); 

を:これは、あなたがSharedElement遷移を使用している場合は、呼び出すことによって、フェードデフォルトの活動の推移を無効にすることができ

ActivityCompat.postponeEnterTransition(this); 
final View decorView = getWindow().getDecorView(); 
decorView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
     decorView.removeOnLayoutChangeListener(this); 
     View navigationBarBackground = getWindow().getDecorView().findViewById(android.R.id.navigationBarBackground); 
     if (navigationBarBackground != null) { 
      android.support.v4.view.ViewCompat.setTransitionName(navigationBarBackground, "navigationBg"); 
     } 
     ActivityCompat.startPostponedEnterTransition(MyActivity.this); 
    } 
}); 
+2

カスタム背景を使用している間は、遷移名として 'Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME'と' Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME'を使うべきです。 – kuelye

0

と呼ばれる活動にonCreate()方法でこの問題を解決する方法の例です共有要素がステータスバーの後ろにあり、アニメーションの開始時にグリッチが発生した場合に問題を解決します。

2

(1)あなたのXMLに
android:windowSharedElementsUseOverlay="false"を設定することで、オーバーレイを無効にします。無効にすると、共有要素は呼び出されたアクティビティのビュー階層の一部として描画され、共有要素が誤ってシステムUIバーの上に重ならないようにします。
残念ながら、この動作を無効にするだけでなく、新たな問題を導入するに終わるかもしれない...
は、たとえば、あなたがいずれかの活動で、非共有ビューを見つけるかもしれない、彼らは場所に移行するなどの共有要素をクリップし始めます。ほとんどの場合、XML内の各共有要素の親に対してと"android:clipToPadding="false"を設定することで、これを防ぐことができますが、具体的なユースケースによっては追加の設定が必要な場合があります。
(2)システムバーにすることで、追加の共有要素
としてアクションバー、ステータスバーの背景、およびナビゲーションバーの背景を追加要素を共有し、あなたは、元の共有要素とシステムUIの両方がで描かれていることを確認することができます残りのウィンドウのView階層の上に同じレベルがあります。

View decor = getWindow().getDecorView();
View statusBar = decor.findViewById(android.R.id.statusBarBackground);
View navBar = decor.findViewById(android.R.id.navigationBarBackground);
View actionBar = decor.findViewById(getResources().getIdentifier("action_bar_container", "id", "android"));

は、あなたがより多くの議論this post

関連する問題