gpt4 book ai didi

android - 了解退出/重新进入共享元素转换

转载 作者:可可西里 更新时间:2023-11-01 19:01:02 24 4
gpt4 key购买 nike

我正在对 Android L 中的共享元素转换做一些初步探索。我设置的简单示例有一个 ImageView ,在 Activity 转换期间从屏幕顶部转换到屏幕底部,我已经扩展了过渡持续时间,这样我就可以看到一切正常。到目前为止,我遇到了两个问题,试图了解共享元素转换的工作原理。

1) 仅使用 Enter/Return 转换时(Exit/Reenter 设置为空)。进入过渡很好,但是当按下后退按钮时, View 会动画一段时间,停止,然后重新出现在最终位置。似乎类似于 this question但我已将所有 Exist/Reenter 转换设置为 null,所以不确定为什么会发生。

2)仅使用退出/重新进入转换时(进入/返回设置为空)。什么都没有发生, View 在屏幕上向下过渡,就像它遵循默认的进入过渡(持续 300 毫秒)一样,当按下返回时, View 会弹出回到其原始位置。

如何使用退出/重新进入转换?

这是我的代码:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/ic_launcher"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Animate!"
android:id="@+id/button"
android:layout_centerVertical="true"
android:layout_alignParentStart="true" />

</RelativeLayout>

activity_second.xml

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView2"
android:src="@drawable/ic_launcher"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />

主 Activity .java

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);


getWindow().setSharedElementExitTransition(exitTransition());
getWindow().setSharedElementReenterTransition(reenterTransition());
//getWindow().setSharedElementExitTransition(null);
//getWindow().setSharedElementReenterTransition(null);


setContentView(R.layout.activity_main);

final View iView = findViewById(R.id.imageView);
iView.setTransitionName("image");

final Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
ActivityOptions options = ActivityOptions
.makeSceneTransitionAnimation(MainActivity.this, iView, "image");
startActivity(intent, options.toBundle());
}
});
}

private Transition exitTransition() {
ChangeBounds bounds = new ChangeBounds();
bounds.setInterpolator(new BounceInterpolator());
bounds.setDuration(2000);

return bounds;
}

private Transition reenterTransition() {
ChangeBounds bounds = new ChangeBounds();
bounds.setInterpolator(new OvershootInterpolator());
bounds.setDuration(2000);

return bounds;
}
}

第二个 Activity .java

public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);


//getWindow().setSharedElementEnterTransition(enterTransition());
//getWindow().setSharedElementReturnTransition(returnTransition());
getWindow().setSharedElementEnterTransition(null);
getWindow().setSharedElementReturnTransition(null);


setContentView(R.layout.activity_second);

final View iView = findViewById(R.id.imageView2);
iView.setTransitionName("image");
}

@Override
public void onBackPressed() {
super.onBackPressed();
finishAfterTransition();
}

private Transition enterTransition() {
ChangeBounds bounds = new ChangeBounds();
bounds.setDuration(2000);

return bounds;
}

private Transition returnTransition() {
ChangeBounds bounds = new ChangeBounds();
bounds.setInterpolator(new DecelerateInterpolator());
bounds.setDuration(2000);

return bounds;
}
}

最佳答案

  1. 您不应在 onBackPressed() 中调用 finishAfterTransition()Activity 父类(super class)已经为您完成了这项工作。

  2. 您应该在 super.onCreate() 之前调用 requestFeature()。如果您使用的是 Theme.Material 主题(或类似主题),则无需请求 Window.FEATURE_ACTIVITY_TRANSITIONS

  3. 调用 setAllowEnterTransitionOverlap(false)setAllowReturnTransitionOverlap(false) 在这里是多余的。这些决定了 Activity 的窗口内容转换重叠......它们根本不影响 Activity 的共享元素内容转换。

  4. 很少需要设置退出和重新进入共享元素转换。您几乎总是想改用进入和返回过渡。如果您只设置退出和重新进入共享元素转换并将进入和返回共享元素转换保留为 null,则被调用的 Activity 将无法知道如何在转换开始时为共享元素设置动画,并且动画会出现中断.

关于android - 了解退出/重新进入共享元素转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27346020/

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