这是我到目前为止所拥有的:
class ChooseUpload : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_choose_upload)
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
}
override fun onStop() {
overridePendingTransition(0, android.R.anim.fade_out)
super.onStop()
}
}
如您所见,我已经尝试过2次来设置淡出动画,但是它不起作用,它仍然会从左向右滑动。淡入淡出。
那么,如何既使它们工作又设置动画的持续时间呢?我希望它很快
在开始活动之前,我也尝试过这样做:
val bundle = ActivityOptionsCompat.makeCustomAnimation(
this,
android.R.anim.fade_in, android.R.anim.fade_out
).toBundle()
startActivity(i, bundle)
答案 0 :(得分:0)
为了触发ActivityOptionsCompat
的退出动画,您必须在完成活动后调用supportFinishAfterTransition()
,而不仅仅是通常的finish()
。以我的经验,除了覆盖待处理的动画之外,您还需要执行此操作。
确保在主题中设置了<item name="android:windowActivityTransitions">true</item>
。
您可以直接在动画.xml文件中设置持续时间。这里以我的stay.xml
为例:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="0%"
android:toYDelta="0%" />
为方便起见,我已将此逻辑放入BaseActivity:
abstract class BaseActivity: AppCompatActivity() {
private var transition: Transition? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
transition = intent.getParcelableExtra(TRANSITION_ANIMATION)
}
override fun finish() {
transition?.let { animation ->
transition = null //Prevent recursive loop
supportFinishAfterTransition().also { overridePendingTransition(Transition.stay, animation.exitId) }
} ?: run {
super.finish()
}
}
companion object {
const val TRANSITION_ANIMATION = "TRANSITION_ANIMATION"
}
}
fun Activity.startActivityWithAnimation(intent: Intent, transition: Transition) {
intent.putExtra(BaseActivity.TRANSITION_ANIMATION, transition as Parcelable)
startActivity(intent, ActivityOptionsCompat.makeCustomAnimation(this, transition.enterId, Transition.stay).toBundle())
}
@Parcelize
enum class Transition constructor(val enterId: Int, val exitId: Int) : Parcelable {
FADE(android.R.anim.fade_in, android.R.anim.fade_out);
companion object {
val stay: Int
get() = R.anim.stay
}
}
答案 1 :(得分:0)
要在返回时设置自定义屏幕动画,请尝试在您的活动中覆盖finish
方法:
override fun finish() {
super.finish()
overridePendingTransition(0, R.anim.my_fade_out)
}
要自定义动画属性(例如持续时间),可以定义自定义动画器:在 res / anim 文件夹中创建具有以下内容的 my_fade_out.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="200" />
更改duration
的值以设置自定义持续时间,也可以根据需要定义动画interpolator
。
作为提示,您可以使用标准的android动画师xml文件作为创建自己的动画的参考,只需键入此类动画师资源的 id (例如android.R.anim.fade_in
)并使用< em>“转到定义” 打开xml文件。
我还要提及的是,使用更简洁的方法将自定义输入动画用于新活动的方法如下:
fun gotoChooseUploadScreen(context: Context) {
val bundle = ActivityOptions.makeCustomAnimation(context, android.R.anim.fade_in, android.R.anim.fade_out).toBundle()
val intent = Intent(context, ChooseUpload::class.java)
context.startActivity(intent, bundle)
}