gpt4 book ai didi

android - 具有共享元素的 Activity 转换中出现问题

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

我想使用 Android Lollipop 的新 Activity Transitions。但目前我在动画中看到非常奇怪的问题。我拼凑了我能想到的最小样本。

这是我在一个非常简短的版本中所做的:

  1. 在我的 styles.xml 中启用窗口内容转换
  2. 引用了一个非常简单的 slide.xml 作为我风格的退出过渡
  3. 为两种布局中的共享元素提供了 android:transitionName
  4. 调用了 ActivityOptions.makeSceneTransitionAnimation() 并使用了我想分享的那个名称和 View
  5. 将生成的包传递给 startActivity()

这是我看到的行为(尝试将动画速度减慢 10 倍以了解我的意思):就在幻灯片动画滑下未共享的 View 之前,那些 View 跳了一点。他们实际上分开了一点。

但是:这只会在我运行该动画时发生第二次(以及之后的每一次)。第一关看起来还不错。而且这只有在我想与下一个 Activity 共享元素时才会发生。如果我不尝试共享元素,一切正常。

这是我的代码:

values/styles.xml

<resources>
<style name="AppTheme" parent="android:Theme.Material.Light">
<!-- enable window content transitions -->
<item name="android:windowContentTransitions">true</item>

<!-- specify exit transition -->
<item name="android:windowExitTransition">@transition/slide</item>
</style>
</resources>

transition/slide.xml

<slide />

主要 Activity 的布局

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

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#0000ff" />

<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#00ff00" />

<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#0000ff" />

<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#00ff00" />

</LinearLayout>

<!-- the actual element I want to share -->
<View
android:id="@+id/view"
android:layout_width="56dp"
android:layout_height="56dp"
android:background="#ff0000"
android:elevation="8dp"
android:transitionName="view" />

</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener {

View mView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mView = findViewById(R.id.view);
mView.setOnClickListener(this);
}

@Override
public void onClick(View view) {
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mView, "view");

Intent intent = new Intent(this, SecondaryActivity.class);
startActivity(intent, options.toBundle());
}


}

最佳答案

您可能遇到了过渡库中的错误,由于某种原因,直到 L 被锁定后才被发现。

在bug中,必须有reenter transition和shared element reenter transition。默认的重新进入转换与两者的退出转换相同。

如果在返回转换期间,共享元素在 View 仍在进入时被传输回调用 Activity,当它中断返回调用时,您会看到一个小问题。通过滑动和爆炸过渡,您还会看到下次退出时,它们将从打嗝发生的地方开始,所以您会得到一个很好的双重打击。

因此,在 MR1 之前,您有几个选项可以解决此错误:

  • android:windowSharedElementReenterTransition 显式设置为 @null。大多数时候您不需要共享元素重新进入转换,因为被调用的 Activity 会为您将共享元素放置在正确的位置。
  • 不要使用退出转换(将 android:windowReenterTransition 设置为 @null)
  • 确保调用 Activity 的 android:windowSharedElementReturnTransition 的持续时间足够长,以便调用 Activity 的 windowReenterTransition 先完成。这可能很棘手,因为它可能取决于设备状态——调用 Activity 可能已从内存中删除并需要重新启动。
  • android:windowAllowReturnTransitionOverlap 设置为 false

关于android - 具有共享元素的 Activity 转换中出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26567822/

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