2016-07-26 68 views
15

我正在嘗試將共享元素轉換添加到我的應用程序中。共享元素轉換:嵌入到另一個活動中的片段中的活動

情景是用戶點擊圖像縮略圖而不是用全屏圖像查看打開另一個活動。

如果共享視圖直接託管在目標活動的佈局中,這可以正常工作。適合進入/退出動畫。 但是,當我試圖實現類似片段這是嵌套在目標活動內的類似效果此方法不起作用。有趣的是,沒有顯示輸入動畫,但退出動畫工作正常。

另一個更復雜的視圖層次結構是,如果目標視圖(ImageView)託管在目標活動框架佈局中的視圖分頁器中。

有人有同樣的問題嗎?

編輯: 我點擊收聽代碼

public class OnClickPicture extends OnClickBase { 
    private ObjectPicture object; 

    public OnClickPicture(Activity_Parent activity, ObjectPicture object) { 
    super(activity); 
    this.object = object; 
    } 

    public void onClick(View v) { 

    picasso.load(object.getFullUrl()).fetch(); 
    Intent intent = new Intent(activity, ActivityPicture.class); 
    intent.putExtra("picture_object", helper.gson.toJson(object)); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && v != null) { 
     Pair<View, String> p1 = Pair.create(v, "image"); 
     ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, p1); 
     activity.startActivity(intent, options.toBundle()); 
    } else { 
     activity.startActivity(intent); 
    } 

    } 

} 

回答

21

是轉變工作需要新的活動中創建,測量奠定了之前的任何動畫可以發生的方式。這樣就可以找到想要製作動畫並創建合適動畫的視圖。

在你的情況下,這不會發生,因爲如stated in the docs,所有FragmentTransaction.commit()所做的是安排工作。它不會立即發生。因此,當框架創建你的活動時,它不能找到你想要動畫的視圖。這就是爲什麼你沒有看到一個條目動畫,但你看到一個退出動畫。當你離開活動時,視圖就在那裏。

該解決方案非常簡單。首先你可以試試FragmentManager.executePendingTransactions()。這仍然可能不夠。轉換框架有另一種解決方案:

在活動postponeEnterTransition()的onCreate。這告訴框架要等到你告訴它它可以安全地創建動畫。這意味着你需要告訴它它的安全(通過調用startPostponedEnterTransition())。在你的情況下,可能會在碎片onCreateView。

這裏有一個如何可能看起來像一個例子:

活動B

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // etc 
    postponeEnterTransition(); 
} 

片段B

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View sharedView = root.findViewById(R.id.shared_view); 
    sharedview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 
      sharedview.getViewTreeObserver().removeOnPreDrawListener(this); 
      getActivity().startPostponedEnterTransition(); 
      return true; 
     } 
    }); 
} 

感謝Alex洛克伍德他detailed blog posts about the Transitions framework

+0

您也可以在不添加OnPreDrawObserver的情況下實現此目的。只需重寫片段中的onViewCreated並在其中調用startPostponedEnterTransition() – Daveloper87

+0

完美且乾淨的解釋。謝謝 – GvSharma

相關問題