【问题标题】:Enter transition on a fragment with a shared element targets the shared element在具有共享元素的片段上输入转换以共享元素为目标
【发布时间】:2015-01-10 01:28:01
【问题描述】:

我在片段上使用新的 Lollipop api 到 setEnterTransition,然后为片段中的图像添加共享元素转换。期望的行为是首先,图像应该移动到它的位置,之后片段中的其余视图应该淡入。

但是,enterTransition 被应用于共享元素,因此它与其余视图一起淡入。如果我不设置 enterTransition,则图像会正确移动,但在移动其他内容时已经可见。

如何让它不将 enterTransition 应用于共享视图?

我发现 this commit in the AOSP 似乎应该可以解决这个问题,但它似乎不起作用。

这里是示例代码:

public class Fragment1 extends Fragment {

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                           Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.main_fragment, container, false);
    final ImageView imageView = (ImageView) rootView.findViewById(R.id.image);
    final Button button = (Button) rootView.findViewById(R.id.button);

    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        TransitionSet transitionSet = new TransitionSet();
        transitionSet.addTransition(new ChangeImageTransform());
        transitionSet.addTransition(new ChangeBounds());
        transitionSet.setDuration(300);

        Fragment fragment2 = new Fragment2();
        fragment2.setSharedElementEnterTransition(transitionSet);
        fragment2.setSharedElementReturnTransition(transitionSet);
        Fade fade = new Fade();
        fade.setStartDelay(300);
        fragment2.setEnterTransition(fade);

        getFragmentManager().beginTransaction()
            .replace(R.id.container, fragment2)
            .addSharedElement(imageView, "SharedImage")
            .commit();
      }
    });
    return rootView;
  }
}

【问题讨论】:

    标签: android android-fragments android-5.0-lollipop android-transitions


    【解决方案1】:

    进入过渡不应应用共享元素视图。最可能的情况是您的共享元素位于另一个具有背景的视图中,从而使该视图受到输入转换的影响。情况是这样的:

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#FFF"
        >
        <ImageView android:src="@drawable/pretty_picture"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:transitionName="picture"
            android:padding="20dp"/>
    </FrameLayout>
    

    这里,ImageView 是共享元素。

    如果发生这种情况,您需要添加一个神奇的过渡:ChangeTransform。如果检测到父元素发生变化,就会从父元素中拉出共享元素,单独过渡。

    【讨论】:

    • 乔治,我可以吻你!这解决了我的视图总是从第二个片段的屏幕顶部开始动画而不是从它们在第一个片段中的位置开始的问题。这是我的问题的链接(这有很多 cmets)谢谢! stackoverflow.com/questions/26950801/…
    • George,这就是 ChangeTransform 最初的用途吗?还是它的具体实现恰好涵盖了这种情况?使用ChangeTransform 会神奇地解决问题似乎几乎是任意的。为什么ChangeBoundsChangeImageTransform等也没有实现覆盖这种情况的原因是什么?
    • 是的。过渡通常会为一小组属性设置动画,以便可以根据需要组合过渡。我们需要分别处理父子转换的情况。由于这需要动画相同的属性,我们不得不合并看似不同的过渡。
    • @GeorgeMount 您能否详细说明一下答案?更改转换应该应用于共享元素还是它的父元素?
    • @GeorgeMount 我有作为共享元素的 ImageView,我没有像上面那样包装框架布局并且也使用 ChangeTransform。一切都很好。我的问题是我试图在 onTransitionEnd 中将 ImageView 设置为 GONE 但它不起作用,我尝试调试并看到可见性标志仍然可见。所以我试图将我的 ImageView 放在上面的 FrameLayout 中,并在 FrameLayout 上切换可见性更改并且它正在工作。任何想法为什么它工作?谢谢
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多