配置更改后,共享元素返回/重新进入转换中断

时间:2016-09-01 21:11:13

标签: android material-design android-transitions shared-element-transition

我有活动A和B,共享元素转换,效果很好,直到:

  1. 从A转换 - > B纵向纵向
  2. 在B中,将方向更改为横向
  3. 回击
  4. 共享元素不知道返回的位置,它只是在其位置愚蠢浮动,直到重新进入转换完成,然后消失
  5. 这看起来很尴尬。我理解这是因为最初共享元素连接到A的纵向景观,而不是景观景观。可以采取一切措施来缓解疼痛吗?

    我使用与上述完全相同的方案检查了Google Play商店应用,从列表中选择了一个应用,然后在方向更改后返回列表。它似乎只是弹回到列表而没有任何动画,但这已经好多了,因为至少没有破坏的过渡和浮动元素。实现这种行为的方法是什么?


    更新:为了明确说明,以下方案完全正常

    1. 从A转换 - > B纵向纵向
    2. 在B中,将方向更改为横向
    3. 再次改变方向,回到肖像
    4. 回击
    5. 共享元素完美地完成其工作并返回到A
    6. 因此,视图不会在配置更改后继续存在。

1 个答案:

答案 0 :(得分:1)

我正在回答我自己的问题,至少是关于如何在方向改变后没有过渡而回到之前的活动的部分。

  1. 在活动onCreate()中,创建或恢复保留原始屏幕方向的保留片段
  2. 覆盖onBackPressed()并检查当前屏幕方向是否与原始屏幕方向相同。如果没有,只需完成活动(无转换)。

    private State state;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initState();
    }
    
    private void initState() {
        String tag = "state";
        FragmentManager fm = getFragmentManager();
    
        // find or create fragment
        this.state = (State) fm.findFragmentByTag(tag);
        if (this.state == null) {
            this.state = new State();
            fm.beginTransaction().add(this.state, tag).commit();
    
            // store original screen orientation
            this.state.originalOrientation = getResources().getConfiguration().orientation;
        }
    }
    
    @Override
    public void onBackPressed() {
        // shared element would be broken
        if (getResources().getConfiguration().orientation != state.originalOrientation) {
            // no transition
            finish();
    
        } else {
            // default behavior
            super.onBackPressed();
        }
    }
    
    public static class State extends Fragment {
        private int originalOrientation;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setRetainInstance(true);
        }
    }
    
  3. 解决原始问题显然会更好,但没有任何过渡比破坏过程更好。