其他分享
首页 > 其他分享> > android – 在共享元素活动过渡中动画嵌套视图时出现故障?

android – 在共享元素活动过渡中动画嵌套视图时出现故障?

作者:互联网

我一直在搞乱Android 5.0中的新API,并且一直试图弄清楚是否有可能在Activity transition期间将ViewGroup和其中一个子项分别设置为共享元素.

下面的屏幕截图给出了我想要实现的简化示例:

 

在第一个活动中,深灰色框是以屏幕为中心的ViewGroup,红色框是其子视图(我正在使用的布局XML代码可以在here中找到).当用户点击深灰色框时,深灰色框应逐渐向上扩展以填充第二个活动的背景.同时,红色框应逐渐缩放并重新定位在第二个活动的左上角.

活动&动画代码

我用来执行转换的Activity代码很简单:

/** FirstActivity.java */
public class FirstActivity extends Activity implements View.OnClickListener {
    private View mOuterBox, mInnerBox;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
        getWindow().setSharedElementExitTransition(new ChangeBounds());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        mOuterBox = findViewById(R.id.outer_box);
        mInnerBox = findViewById(R.id.inner_box);
        mOuterBox.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Pair<View, String> outerBox = Pair.create(mOuterBox, mOuterBox.getTransitionName());
        Pair<View, String> innerBox = Pair.create(mInnerBox, mInnerBox.getTransitionName());
        Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(this, outerBox, innerBox).toBundle();
        startActivity(new Intent(this, SecondActivity.class), bundle);
    }
}

/** SecondActivity.java */
public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
        getWindow().setSharedElementEnterTransition(new ChangeBounds());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
}

问题

当我点击第一个活动中的深灰色框时,共享元素过渡开始,深灰色框很好地缩放以填充第二个活动的背景.但是,红色框似乎根本没有动画效果.一旦过渡开始,红色框突然调整大小并将其自身定位在第二个活动中的最终位置,然后灰色框甚至完成动画.

我的问题

是否可以将ViewGroup及其一部分/全部子视图独立地设置为活动转换中的共享元素?如果是这样,我做错了什么,我该怎样做才能确保孩子的观点也是动画的呢?

如果您在跟踪我的描述时遇到问题,则此示例项目的完整源代码可在GitHub获得,并且可运行的APK可供下载here(您需要运行Android 5.0的物理设备或模拟器才能运行APK).

解决方法:

是的,您可以单独转换组及其内容.但是您刚刚发现了一个将在L MR1中修复的错误.

看来这在L中得不到很好的支持.我建议你在第二个Activity中创建共享元素兄弟:

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/dark_gray"
        android:transitionName="outer_box"/>

    <RelativeLayout
        android:id="@+id/outer_box"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <View
            android:id="@+id/inner_box"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginLeft="50dp"
            android:layout_marginTop="50dp"
            android:background="@color/red"
            android:transitionName="inner_box" />
    </RelativeLayout>
</FrameLayout>

标签:android,android-5-0-lollipop,shared-element-transition,activity-transition
来源: https://codeday.me/bug/20191005/1855503.html