Android 片段中的共享元素和内容转换

Android 片段中的共享元素和内容转换,android,android-transitions,Android,Android Transitions,我有以下问题: 我正在尝试从片段A转换到片段B。这些片段之间有一个共享元素,以按钮和其他一些视图的形式存在(请参见布局) 有人能帮我得到想要的行为吗 更新: 我已经做了一项工作,几乎实现了我想要的功能,在我的视图上使用animate()来滑动/淡入,并在完成此动画后触发共享元素事务: Transition sharedElementTransition = TransitionInflater.from(getActivity()).inflateTransition(android.R.tra

我有以下问题:

我正在尝试从
片段
A转换到
片段
B。这些片段之间有一个共享元素,以
按钮
和其他一些
视图
的形式存在(请参见布局)

有人能帮我得到想要的行为吗

更新:

我已经做了一项工作,几乎实现了我想要的功能,在我的视图上使用
animate()
来滑动/淡入,并在完成此动画后触发共享元素事务:

Transition sharedElementTransition = TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move);
sharedElementTransition.setStartDelay(400);
fragment.setSharedElementEnterTransition(sharedElementTransition);
setSharedElementReturnTransition(sharedElementTransition);

mLoginBtn.animate()
   .x(-mLoginBtn.getWidth())
   .setDuration(400)
   .start();

viewFlipper.animate()
   .x(-viewFlipper.getWidth())
   .setDuration(400)
   .setListener(new AnimatorListenerAdapter() {
   @Override
   public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        transaction.commit();
   }
})
.start();

fragment.setEnterSharedElementCallback(new SharedElementCallback() {
   @Override
   public void onSharedElementStart(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
   super.onSharedElementStart(sharedElementNames, sharedElements, sharedElementSnapshots);
   viewFlipper.animate()
           .x(0)
           .setDuration(400)
           .setListener(null)
           .start();

   mLoginBtn.animate()
           .x(0)
           .setDuration(400)
           .start();
   });
Transition-sharedElementTransition=TransitionInflater.from(getActivity()).inflateTransition(android.R.Transition.move);
sharedElementTransition.setStartDelay(400);
fragment.setSharedElementTransition(sharedElementTransition);
设置sharedElementTransition(sharedElementTransition);
mLoginBtn.animate()
.x(-mLoginBtn.getWidth())
.setDuration(400)
.start();
viewFlipper.animate()
.x(-viewFlipper.getWidth())
.setDuration(400)
.setListener(新的AnimatorListenerAdapter(){
@凌驾
AnimationEnd上的公共无效(Animator动画){
super.onAnimationEnd(动画);
commit();
}
})
.start();
fragment.setEnterSharedElementCallback(新的SharedElementCallback(){
@凌驾
在SharedElementStart(列出sharedElementNames、列出sharedElements、列出sharedElementSnapshots)上公开作废{
super.onSharedElementStart(sharedElementNames、sharedElements、SharedElementSnapshot);
viewFlipper.animate()
.x(0)
.setDuration(400)
.setListener(空)
.start();
mLoginBtn.animate()
.x(0)
.setDuration(400)
.start();
});

这个解决方案的问题是,我无法在被调用的
片段的
视图中滑动,所以我现在只需在
视图中淡入
如果您只需要在按钮静止的情况下设置片段的动画,您可以将按钮移动到活动中并设置片段的动画。

愚蠢的问题,但您有没有您可以提供相同的元素ID,然后可以提供(或删除)转换到必需的元素。@Droidekas我看过一些场景,但我不确定如何使用它们来解决我的问题…我已经做了一项工作,几乎可以满足我的需要,我将用当前的解决方案更新我的问题。但仍在寻找一种方法来使用转换框架。如果你能详细说明什么是你需要两个片段中的两个不同的按钮实例,如果这两个按钮确实将共享给用户一个可视的“视图”。如果用户只看到一个按钮…那么为什么不拥有一个按钮实例(由活动维护,或者可能是另一个单一目的片段)然后让你的两个内容片段以某种方式获取对它的引用?我使用两个片段是因为我希望每个片段负责按钮的行为,这在两个片段中是不同的,并且很容易为两个屏幕进行布局,这两个屏幕与共享按钮完全不同。如果在活动的布局中,我很难将布局正确。但如果这是获得共享元素所需行为的唯一方法,那么我可能会尝试一下。你能提供一个问题的视频吗?这将有助于更好地理解你试图实现的目标和问题所在
Fragment fragment = MyFragment.newInstance();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.hide(this);
fragmentTransaction.add(R.id.frame_container, fragment, fragment.getClass().getSimpleName());
fragmentTransaction.addSharedElement(sharedElement, sharedElementTag);
Transition sharedElementTransaction = TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move);
sharedElementTransaction.setStartDelay(400);
fragment.setSharedElementEnterTransition(sharedElementTransaction);
setExitTransition(new Slide(Gravity.LEFT).setDuration(200));
fragment.setEnterTransition(new Slide(Gravity.RIGHT).setDuration(200));
Transition sharedElementTransition = TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move);
sharedElementTransition.setStartDelay(400);
fragment.setSharedElementEnterTransition(sharedElementTransition);
setSharedElementReturnTransition(sharedElementTransition);

mLoginBtn.animate()
   .x(-mLoginBtn.getWidth())
   .setDuration(400)
   .start();

viewFlipper.animate()
   .x(-viewFlipper.getWidth())
   .setDuration(400)
   .setListener(new AnimatorListenerAdapter() {
   @Override
   public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        transaction.commit();
   }
})
.start();

fragment.setEnterSharedElementCallback(new SharedElementCallback() {
   @Override
   public void onSharedElementStart(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
   super.onSharedElementStart(sharedElementNames, sharedElements, sharedElementSnapshots);
   viewFlipper.animate()
           .x(0)
           .setDuration(400)
           .setListener(null)
           .start();

   mLoginBtn.animate()
           .x(0)
           .setDuration(400)
           .start();
   });