26

我正在開發的應用程序顯示圖像網格。當你點擊一個圖像時,它會進入細節視圖。詳細信息視圖包含一個ViewPager,它允許您在網格中的每個圖像之間滑動。這是通過傳遞路徑列表(包含網格中的每個圖像)以及點擊圖像的偏移量來完成的,因此可以將ViewPager設置爲初始顯示該頁面。ViewPager碎片 - 共享元素轉換

在ViewPager中的當前偏移頁面的片段內部有一個共享元素轉換的最佳方式是什麼?網格(RecyclerView)圖像應展開爲當前頁面中的全屏圖像。我看到推遲和恢復活動轉換的能力,因此應用程序將等待顯示共享元素轉換,直到從磁盤加載圖像。但我希望能夠使其在視圖尋呼機中正確的頁面生成動畫,並且退出到用戶返回時的當前頁面(因爲您可以在頁面之間滑動)。如果你現在刷到不同的頁面,最初的頁面是什麼動畫回到網格。

當前,我爲視圖分頁器的片段中的每個圖像分配了格式爲「image_ [index]」的transitionName。當我開始細節活動時,我使用相同的transitionName,索引是偏移量。

與此相關的是,我還想知道如何讓長時間按壓的漣漪效果。當您更改視圖的激活狀態時,它似乎取消了波紋。我想要一個類似於Gmail的效果,其中紋波重新開始並在長按完成後快速結束並觸發激活狀態。

+0

您可能想在另一篇文章中提出關於漣漪的第二個問題。另外,當我有更多時間時,我可以更深入地回答關於視圖尋呼機和共享元素的問題,但現在您可以查看[此示例項目](https://github.com/alexjlockwood/activity -transitions)。幾周前我寫了它,聽起來它幾乎完全符合你所描述的內容。 :P – 2014-12-05 03:32:16

+0

@AlexLockwood好點。哇,你說得對,我只是跑了它,而這正是我所需要的;我將在接下來的幾天看看它,謝謝! – afollestad 2014-12-05 04:35:36

+0

你好這不是爲我工作..我想要的是,我有一個viewpager的片段中的列表,並點擊任何項目我想處理圖像到它的細節片段..我嘗試了每個可能的解決方案,我到這裏..但沒有任何工作..任何幫助將不勝感激。提前感謝。 - – 2016-03-03 10:43:44

回答

34

從我可以告訴(和糾正我,如果我錯了),你要實現的目標基本上是這樣的:假設你有一個MainActivity,一個DetailsActivity和圖像的任意一組。 MainActivity在網格中顯示該組圖像,而DetailsActivity在水平方向上顯示同一組圖像ViewPager。當用戶選擇MainActivity中的圖像時,該圖像應該從網格中的位置轉換到第二個活動的ViewPager中的正確頁面。

我們想要解決的問題是「如果用戶在DetailsActivity內切換頁面怎麼辦」?如果發生這種情況,我們希望更改將在返回轉換期間使用的共享映像。默認情況下,活動轉換框架將使用在輸入轉換期間使用的共享元素...但視圖頁面的頁面已更改,所以顯然我們想以某種方式覆蓋此行爲。要做到這一點,我們需要設置一個SharedElementCallbackMainActivityDetailsActivityonCreate()方法和覆蓋onMapSharedElements()方法,像這樣:

private final SharedElementCallback mCallback = new SharedElementCallback() { 
    @Override 
    public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { 
     if (mCurrentImagePosition != mOriginalImagePosition) { 
      View sharedView = getImageAtPosition(mCurrentImagePosition); 
      names.clear(); 
      sharedElements.clear(); 
      names.add(sharedView.getTransitionName()); 
      sharedElements.put(sharedView.getTransitionName(), sharedView); 
     } 
    } 

    /** 
    * Returns the image of interest to be used as the entering/returning 
    * shared element during the activity transition. 
    */ 
    private View getImageAtPosition(int position) { 
     // ... 
    } 
}; 

爲了更完整的解決方案,我創建了一個sample project on GitHub,將實現這一目標效果(在單個StackOverflow答案中發佈的代碼太多)。

+0

這是完美的,感謝您的幫助! – afollestad 2014-12-05 18:45:05

+0

你好,這不是爲我工作..我想要的是,我有一個viewpager的片段中的列表,並點擊任何項目,我想處理圖像到它的細節片段..我嘗試了我得到的每一個可能的解決方案..但沒有任何工作..任何幫助將不勝感激。提前感謝。 - – 2016-03-03 10:43:49

+0

謝謝,非常有用! – schwertfisch 2016-04-19 16:44:07

3

我假設你正在使用片段轉換,並且你沒有在活動之間進行動畫製作。它可以在活動轉換和片段轉換中使用,但具體的代碼有點不同。儘管如此,延期在片段轉換中不可用。

addSharedElement接受第二個參數。如果您在調用目標片段時知道目標片段中的特定名稱,則可以選擇要使用的詳細片段中的名稱。如果你不這樣做,你可以選擇你想要的任何名字,並使用Fragment上設置的SharedElementCallback重新映射它。

fragment.setEnterSharedElementCallback(new SharedElementCallback() { 
    @Override 
    public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { 
     sharedElements.put("detailView", mTargetDetailView); 
    } 
}); 

如果它在回來的路上不匹配,則會進行相同的調用以重映射它。這可能會在調用片段和被調用片段中 - 在調用片段中,您使用setExitSharedElementCallback。我預計你的應用會出現這種情況。

同樣,在Activity Transitions中,您設置了相同的SharedElementCallback並使用相同的映射,但是您在Activity上執行此操作。

+0

這絕對是我想要做的事情,問題是有兩項活動。一個顯示包含圖像網格的碎片。另一個包含一個ViewPager,其中有詳細的碎片。 – afollestad 2014-12-05 02:15:05

+0

您正在使用Activity轉換,並且恰好您的視圖處於碎片狀態。您可能不得不推遲輸入轉換或在onCreate中執行掛起的片段事務。你現在看到什麼問題? – 2014-12-06 05:17:13