我最近发现,根据android sdk的不同,当改变视图的可见性时,它的行为也会有所不同。
在奥利奥之前,当从VISIBLE
设置为GONE
时,视图首先根据alpha从1渐隐到0,然后视图使用的位置将折叠。
对于Oreo和更高版本(我想我还没有在Android q上测试过),当从VISIBLE
设置为GONE
时,视图会在淡入淡出时折叠,对其他视图进行裁剪,因为alpha还没有设置为零。
我没有发现任何关于这个特殊情况的东西,只知道我必须通过定制我的视图来重新制作一些帖子上的动画。
我将在下面回答我自己。
发布于 2019-08-06 16:44:33
所以我创建了我的自定义视图,经过大量的调试之后,我发现我需要覆盖setAlpha
方法:
class CustomViewAnimation(context: Context, attributeSet: AttributeSet) : ConstraintLayout(context, attributeSet) {
private fun callToSuper(alpha: Float) {
super.setAlpha(alpha)
}
override fun setAlpha(alpha: Float) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
super.setAlpha(alpha)
else {
if (this.visibility == View.GONE)
super.setAlpha(0f)
else if (this.visibility == View.VISIBLE && alpha != 1f)
super.setAlpha(0f)
else if (this.visibility == View.VISIBLE && alpha == 1f)
this.animate()
.alpha(1f)
.setListener(object : Animator.AnimatorListener {
override fun onAnimationRepeat(animation: Animator?) {}
override fun onAnimationEnd(animation: Animator?) {
callToSuper(1f)
}
override fun onAnimationCancel(animation: Animator?) {}
override fun onAnimationStart(animation: Animator?) {}
})
}
}
}
您还必须在您的代码中更改可见性的动画的其他部分:
if (view.visibility == View.VISIBLE) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
view.animate()
.alpha(0.0f)
.setListener(object : Animator.AnimatorListener {
override fun onAnimationRepeat(animation: Animator?) {}
override fun onAnimationEnd(animation: Animator?) {
view.alpha = 0.0f
view.visibility = View.GONE
}
override fun onAnimationCancel(animation: Animator?) {}
override fun onAnimationStart(animation: Animator?) {}
})
} else
view.visibility = View.GONE
} else
view.visibility = View.VISIBLE
由于有许多条件,这可能不是最好的方法,但同样,我没有找到其他任何东西,而且这种方法工作得很好。
https://stackoverflow.com/questions/57372158
复制相似问题