对于 Activity,在 startActivity 或 finish 后调用
overridePendingTransition(R.anim.activity_in, R.anim.activity_out)
对于 Fragment:
supportFragmentManager.beginTransaction().setCustomAnimations(R.anim.fragment_enter, R.anim.fragment_exit)
ActivityOptions
从 Android 5.0 之后,可以用 ActivityOptions 来实现,ActivityOptionsCompat 是 support v4 的兼容实现,可以支持到 4.1(SDK 16),它有几个 make 开头的方法
- makeCustomAnimation(Context context, int enterResId, int exitResId)
- makeScaleUpAnimation(View source, int startX, int startY, int startWidth, int startHeight)
- makeThumbnailScaleUpAnimation(View source, Bitmap thumbnail, int startX, int startY)
- makeClipRevealAnimation(View source, int startX, int startY, int width, int height)
- makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName)
- makeSceneTransitionAnimation(Activity activity, Pair<View, String>... sharedElements)
makeCustomAnimation
custom.onClick {
val compat = ActivityOptionsCompat.makeCustomAnimation(ctx, R.anim.activity_in, R.anim.activity_out)
start(it!!, compat)
}
private fun start(view: View, compat: ActivityOptionsCompat) {
val intent = Intent(ctx, OptionAfterActivity::class.java)
intent.putExtra("from", (view as Button).text)
// SDK 16 以下会忽略 compat.toBundle()
ActivityCompat.startActivity(ctx, intent, compat.toBundle())
}
最普通的,效果和过去的 overridePendingTransition 一样。
OptionAfterActivity 的布局就只有一个 TextView
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".OptionAfterActivity"
android:background="#5500f2f0">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="18sp"
android:layout_centerInParent="true"/>
</RelativeLayout>
class OptionAfterActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_option_after)
// 接收前一个方法传过来的名字显示出来
tv.text = intent.extras["from"].toString()
}
override fun onBackPressed() {
ActivityCompat.finishAfterTransition(this)
}
}
发现 ActivityCompat.finishAfterTransition(this)
并没什么用。看源码
public static void finishAfterTransition(Activity activity) {
if (Build.VERSION.SDK_INT >= 21) {
activity.finishAfterTransition();
} else {
activity.finish();
}
}
好吧,ActivityCompat.startActivity
是 SDK >= 16
就生效,这退出的必须 >= 21
才行。再继续往下走
public void finishAfterTransition() {
if (!mActivityTransitionState.startExitBackTransition(this)) {
finish();
}
}
public boolean startExitBackTransition(final Activity activity) {
if (mEnteringNames == null || mCalledExitCoordinator != null) {
return false;
} else {
if (!mHasExited) {
// 能判断对这里才真正执行页面返回的动画
}
return true;
}
}
而这个 mEnteringNames 的定义是:
The shared elements that the calling Activity has said that they transferred to this
很可惜,此时的 mEnteringName