Activity切换动画实现,以及黑屏问题解决

主要参考 https://www.jianshu.com/p/9b24929cf58e

现在在设计全局主题的时候,可以在application里面全局设置,也可以在activity里面设置,这里优先级高于在application里面的主题设置



场景:

  • A打开B页面,A页面保持不动,B页面从底部滑入显示
  • B返回A页面,A页面保持不动, B页面从顶部向下滑出消失

1:通过Theme的windowAnimationStyle属性实现



    

使用过程用,如果没有设置android:activityOpenExitAnimation和android:activityCloseEnterAnimation这两个A页面的消失动画,就可能会出现短暂的黑屏交互现象;
如果theme设置windowIsTranslucent为true(这种设置为true的方法在某些手势退出手机里面再次返回app会出现界面闪烁问题,本人不建议使用,我使用的就是第一种方法去避免黑屏),则建议继承Animation.Translucen,否则动画可能不生效,如下:

    

另外一种解决windowIsTranslucent为true的时候,动画效果不生效的方案:

open var activityCloseEnterAnimation: Int = 0
open var activityCloseExitAnimation: Int = 0
    
   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initWindowAnimAttr()
    }

    @SuppressLint("ResourceType")
    private fun initWindowAnimAttr() {
        try {
            var activityStyle = theme.obtainStyledAttributes(intArrayOf(R.attr.windowAnimationStyle))
            val windowAnimationStyleResId = activityStyle.getResourceId(0, 0)
            activityStyle.recycle()
            activityStyle = theme.obtainStyledAttributes(windowAnimationStyleResId, intArrayOf(R.attr.activityCloseEnterAnimation, R.attr.activityCloseExitAnimation))
            activityCloseEnterAnimation = activityStyle.getResourceId(0, 0)
            activityCloseExitAnimation = activityStyle.getResourceId(1, 0)
            activityStyle.recycle()
        } catch (e: Exception) {
        }
    }

     override fun finish() {
        super.finish()
        isDestroy = true
        overridePendingTransition(activityCloseEnterAnimation, activityCloseExitAnimation)
    }

anim_bottom_in, anim_no以及anim_bottom_out的动画文件如下

!---anim_bottom_in


    


!---anim_no


    


!---anim_bottom_out


    

2: 通过overridePendingTransition实现效果

在页面B的onCreate方法和finish方法中加入以下代码

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  overridePendingTransition(R.anim.anim_bottom_in,R.anim.anim_no)
}
//重写finish方法
override fun finish() {
 super.finish() 
 overridePendingTransition(R.anim.anim_no,R.anim.anim_bottom_out)
}

你可能感兴趣的:(Activity切换动画实现,以及黑屏问题解决)