Android Kotlin-淡出活动并设置持续时间

时间:2020-10-07 17:13:11

标签: android kotlin

这是我到目前为止所拥有的:

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)

2 个答案:

答案 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)
}