11

对于共享元素转换,我正在关注这个github 项目。它有 2 个屏幕 - 一个带有 recyclerview 的卡片数量,第二个是详细屏幕。正如预期的那样,它展示了从 recyclerview 项目到详细屏幕的 imageview 和 textview 的共享元素转换以及后按时的反向转换。

但是,如果用户在详细信息屏幕上更改方向,然后按下返回按钮,则反向过渡动画不起作用。在 2:49 到 2:57 之间查看视频的帧,即使在方向改变之后似乎也是可能的。对此有任何想法吗?

编辑:

请查看此视频以获得更好的理解。

4

4 回答 4

8

最后,我可以通过将单独的主题应用于详细屏幕覆盖以下属性值来解决此问题,但不确定为什么此参数会改变动画行为。

<item name="android:windowIsTranslucent">true</item>
于 2015-03-19T09:37:52.610 回答
2

你必须设置:

requestWindowFeature(Window.FEATURE_CONTENT_TRANSITIONS);
requestWindowFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);

在调用和被调用的活动中(本例中为 MainActivity + NextActivity)。

我假设您通过调用以下方法打开 NextActivity:

ActivityOptions options = ActivityOptions.
      makeSceneTransitionAnimation(this, new Pair<View, String>(viewToAnimate, "animationName"));
Intent intent = new Intent(MainActivity.this, NextActivity.class);
startActivity(intent, options.toBundle());

在 NextActivity 中,您必须添加:

animatingView.setTransitionName("animationName");

如果你这样做,如果你点击后退按钮,转换将起作用。

但是,如果您转动设备并按下后退按钮,它将无法工作。

为了解决这个问题,我在第一个活动中添加了这个(在这个例子中是 MainActivity):

animatingView.setTransitionName("animationName");

系统现在知道屏幕旋转后要制作什么动画。

于 2015-03-13T15:25:23.743 回答
1

如果你进入“开发者选项”并启用“不保留活动”,我想你会发现问题也会出现。换句话说,问题不在于您正在旋转设备......但更一般地说,第一个活动在后台被破坏。

查看您的示例代码,您似乎正在使用适配器做一些奇怪的事情(即每 50 毫秒从后台线程向回收器视图提供新的网格项目)?我明白为什么这可能会给您带来一些问题......例如,如果调用活动被破坏并且需要在用户单击后退按钮并开始返回转换后立即重新创建怎么办?如果共享元素返回转换开始并且所需的共享元素在第一个活动中尚不存在(例如,因为它尚未被适配器添加),则转换将无法正常工作。

我认为这可能足以让您开始解决问题。

于 2015-03-13T18:15:23.777 回答
1

我遇到了同样的问题,这就是我解决它的方法。

单击 RecyclerView 项时,我通过当前位置:

@Override
public void onItemClick(View sharedView, String transitionName, int position) {
    viewPosition = position;
    Intent intent = new Intent(this, TransitionActivity.class);
    intent.putExtra("transition", transitionName);
    ActivityOptionsCompat options = ActivityOptionsCompat.
            makeSceneTransitionAnimation(this, sharedView, transitionName);
    ActivityCompat.startActivity(this, intent, options.toBundle());
}

我将其保存在 onSaveInstanceState 中以在配置更改中保持不变:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt(VIEW_POSITION, viewPosition);
}

然后,在 onCreate 方法中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Workaround for orientation change issue
    if (savedInstanceState != null) {
        viewPosition = savedInstanceState.getInt(VIEW_POSITION);
    }

    setExitSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
            super.onMapSharedElements(names, sharedElements);
            if (sharedElements.isEmpty()) {
                View view = recyclerView.getLayoutManager().findViewByPosition(viewPosition);
                if (view != null) {
                    sharedElements.put(names.get(0), view);
                }
            }
        }
    });
}

问题的原因:方向改变后 sharedElements 地图是空的(我不知道为什么)。

于 2017-03-07T21:25:23.730 回答