【问题标题】:Glitch when animating nested views in a shared element Activity transition?在共享元素活动转换中为嵌套视图设置动画时出现故障?
【发布时间】:2014-10-21 19:49:22
【问题描述】:

我一直在搞乱 Android 5.0 中的新 API,并一直试图弄清楚是否可以在 Activity transition 期间将 ViewGroup 及其一个子元素分别作为共享元素进行动画处理.

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

在第一个活动中,深灰色框是屏幕中心的ViewGroup,红色框是它的子View(我使用的布局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);
    }
}

问题

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

我的问题

是否可以在Activity 转换中将ViewGroup 及其一个/部分/所有子视图独立地作为共享元素进行动画处理?如果是这样,我做错了什么?我能做些什么来确保孩子们的观点也是动画的?

如果您在按照我的描述时遇到问题,此示例项目的完整源代码可在 GitHub 上获得,可运行的 APK 可用于下载 here(您需要运行 Android 5.0 的物理设备或模拟器运行 APK)。

【问题讨论】:

    标签: android android-5.0-lollipop activity-transition shared-element-transition


    【解决方案1】:

    是的,您可以单独转换组及其内容。但是您刚刚发现了一个将在 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>
    

    【讨论】:

    • 太棒了,我刚刚测试了这种方法,效果很好!这有点骇人听闻,但现在就可以了……我想一旦在 Lollipop 的下一个版本中修复了该错误,将会有一个更优雅的解决方案。一旦修复了错误,我将接受这个答案,以强调这只是暂时的解决方法。谢谢!
    • 刚刚测试了这个,看起来这个错误已经修复了。感谢您的帮助!
    猜你喜欢
    • 2015-01-23
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多