0

我爲我的應用程序實現了共享元素轉換,其中轉換從主屏幕上的ViewPager中的片段(使用RecyclerView)開始,並再次擴展到全屏庫視圖在ViewPager中的片段內。這一切都工作正常,除非如果圖像不完全可見,它會擴展到全屏幕之前在TabBar頂部。這裏發生的事情:Android共享元素轉換工具欄重疊

enter image description here

我進入轉型看起來是這樣的:

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

而在調活動我一直的共享元素回調得到這個:

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> 

我真的不明白是怎麼工具欄(或動作條)可以通過過渡沒有得到這種重疊被排除在外。也許有一種方法可以強制圖像被剪切到頂部,以便在ToolBar下不會完全可見,並且只從可見矩形擴展。

我已經嘗試將<target android:excludeId="@id/action_bar_container"/>添加到動畫的目標,但同樣的事情仍然發生。

歡迎任何建議。

回答

2

我在樣式發現了類似的問題,在我的project.Add下面的代碼。

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

它適用於我。

+0

這將減少共享元素視圖的alpha值,這在我的情況下是有道理的,但看起來不太好。但是,這是一個有效的解決方案,所以我會標記爲正確的。 – 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