0

ホーム画面のViewPager内のフラグメント(RecyclerView付き)からフルスクリーンギャラリービューに展開されたイメージでトランジションが開始される、自分のアプリケーション用の共有要素トランジションを実装しましたViewPagerのフラグメント内に存在します。これは、イメージが完全に表示されていない場合は、フルスクリーンに展開する前にTabBarの上に表示されます。ここでは何が起こっているのです:Android共有要素の移行ツールバーのオーバーラップ

<?xml version="1.0" encoding="utf-8"?> 
<fade xmlns:android="http://schemas.android.com/apk/res/android"> 
    <targets> 
     <target android:excludeId="@android:id/statusBarBackground"/> 
     <target android:excludeId="@android:id/navigationBarBackground"/> 
    </targets> 
</fade> 

して終了:

<?xml version="1.0" encoding="utf-8"?> 
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" 
android:transitionOrdering="together" 
android:duration="500"> 
    <fade> 
     <targets> 
      <target android:excludeId="@android:id/statusBarBackground" /> 
      <target android:excludeId="@android:id/navigationBarBackground" /> 
     </targets> 
    </fade> 
</transitionSet> 

そして、私はしまし呼び出しアクティビティの共有要素のコールバックで

enter image description here

は、遷移がこのようになります入力してくださいマイ得られた:

View navigationBar = activity.findViewById(android.R.id.navigationBarBackground); 
View statusBar = activity.findViewById(android.R.id.statusBarBackground); 
if (navigationBar != null) { 
    names.add(navigationBar.getTransitionName()); 
    sharedElements.put(navigationBar.getTransitionName(), navigationBar); 
} 
if (statusBar != null) { 
    names.add(statusBar.getTransitionName()); 
    sharedElements.put(statusBar.getTransitionName(), statusBar); 
} 
最後に、活動テーマについてのstyles.xmlで

<item name="android:windowContentTransitions">true</item> 
<item name="android:windowEnterTransition">@transition/details_window_enter_transition</item> 
<item name="android:windowReturnTransition">@transition/details_window_return_transition</item> 

は、私は本当に理解していないか、ツールバー(またはアクションバー)このオーバーラップを得ることなく移行で除外することができます。ツールバーの下にあるときに完全に表示されず、表示されている矩形からのみ展開されるように、イメージを上部にクリップするようにする方法があります。

アニメーションのターゲットに<target android:excludeId="@id/action_bar_container"/>を追加しようとしましたが、同じことが起こります。

ご提案は大歓迎です。

答えて

2

を私はあなたのスタイルでコードの下の私のproject.Addで同様の問題を発見しました。

<item name="android:windowSharedElementsUseOverlay">false</item> 

私のために働きます。

+0

これは共有要素ビューのアルファ値を減らしますが、それは意味がありますが私の場合は良く見えません。しかし、それは正しい解決策ですので、私は正しいとマークします。 – Georgi

0

私は一時的な回避策を考え出しました。共有要素の遷移が実行される前に、呼び出しアクティビティはターゲットビューがRecyclerViewの範囲内にあるかどうかをチェックします。そうでない場合、RecyclerViewは滑らかにスクロールされて完全なビューを表示し、終了するとトランジションが実行されます。ビューが完全に表示されている場合、トランジションは正常に実行されます。私はよりよい解決策が見つかるまで

// Scroll to view and run animation when scrolling completes. 
recycler.smoothScrollToPosition(adapterPosition); 
recycler.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 

    @Override 
    public boolean onPreDraw() { 
     recycler.getViewTreeObserver().removeOnPreDrawListener(this); 
     // Open activity here. 
     return true; 
    } 
}); 

ここでの結果は、あまりにも悪くはない。

enter image description here

+0

私は怒っている、私は同じ問題がある!このスクロールをどのように実装することができましたか? – user11230

+0

@ user11230はスクロールが完了するまでスクロールして待機する方法の例を使って自分の答えを編集しました。 – Georgi

+0

ありがとうございますが動作しません。あなたが見てみることができれば、私は永遠に感謝しています。私はこれ以来これを修正しようとしています。 https://pastebin.com/uyEpfjvM http://i.imgur.com/cj3kexs.mp4 – user11230

関連する問題