gpt4 book ai didi

android - 在共享元素 Activity 转换中为嵌套 View 设置动画时出现故障?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:25 24 4
gpt4 key购买 nike

我一直在研究 Android 5.0 中的新 API,并且一直在尝试弄清楚是否可以将 ViewGroup 及其子元素之一作为共享元素分别设置动画在 Activity transition 期间.

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

First Activity initial positions Second Activity final positions

在第一个 Activity 中,深灰色框是一个位于屏幕中心的 ViewGroup,红色框是它的子 View(我使用的布局 XML 代码可以找到 here )。当用户点击深灰色框时,深灰色框应逐渐放大以填充第二个 Activity 的背景。同时,红色框应逐渐缩放并重新定位到第二个 Activity 的左上角。

Activity 和动画代码

我用来执行转换的 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 中的深灰色框时,共享元素过渡开始并且深灰色框很好地放大以填充第二个 Activity 的背景。 但是,红色框似乎根本没有动画。过渡开始后,红色框会突然调整大小并将其自身定位在第二个 Activity 中的最终位置,甚至在灰色框完成动画之前。

我的问题

是否可以将 ViewGroup 和它的一个/一些/所有 subview 作为 Activity 转换中的共享元素独立设置动画?如果是这样,我做错了什么,我该怎么做才能确保 child 的观点也充满活力?

如果您无法理解我的描述,可以在 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 - 在共享元素 Activity 转换中为嵌套 View 设置动画时出现故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com