我想使用Android Lollipop的新Activity转换效果,但是在动画过程中我看到了非常奇怪的抖动。我拼凑出了我能够想到的最简单的示例。
这是我简短版的操作:
1. 在我的styles.xml中启用窗口内容转换 2. 在我的样式中引用一个非常简单的slide.xml作为退出转换 3. 为两个布局中的共享元素提供android:transitionName 4. 使用该名称和我要共享的视图调用ActivityOptions.makeSceneTransitionAnimation() 5. 将生成的bundle传递给startActivity()
我看到的行为是(尝试将动画速度慢10倍以了解我的意思):
就在滑动动画滑下不共享的视图之前,那些不共享的视图会跳下一点。它们实际上会稍微分开一点。
但是:这只发生在我第二次运行该动画(以及每次之后)时。第一次通过看起来很好。而且只有在我想要与下一个活动共享一个元素时才会发生这种情况。如果我不尝试共享元素,一切都正常。
以下是我的代码:
values/styles.xml
这是我简短版的操作:
1. 在我的styles.xml中启用窗口内容转换 2. 在我的样式中引用一个非常简单的slide.xml作为退出转换 3. 为两个布局中的共享元素提供android:transitionName 4. 使用该名称和我要共享的视图调用ActivityOptions.makeSceneTransitionAnimation() 5. 将生成的bundle传递给startActivity()
我看到的行为是(尝试将动画速度慢10倍以了解我的意思):
就在滑动动画滑下不共享的视图之前,那些不共享的视图会跳下一点。它们实际上会稍微分开一点。
但是:这只发生在我第二次运行该动画(以及每次之后)时。第一次通过看起来很好。而且只有在我想要与下一个活动共享一个元素时才会发生这种情况。如果我不尝试共享元素,一切都正常。
以下是我的代码:
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 />
主要活动的布局
<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());
}
}
windowExitTransition
,但是你如何设置windowSharedElementExitTransition
?还有,你的第二个活动布局代码是什么样子的? - Alex Lockwoodlayout_weight="1"
之外,给非共享视图固定高度的情况下?此外,还有其他类似的行为吗? - Alex LockwoodwindowSharedElementExitTransition
。因此,我们正在使用主题的默认转换。共享元素在两个布局中已经具有固定大小。 - Greeny