首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oreo之后的可见性更改行为有所不同

Oreo之后的可见性更改行为有所不同
EN

Stack Overflow用户
提问于 2019-08-06 16:44:33
回答 1查看 62关注 0票数 1

我最近发现,根据android sdk的不同,当改变视图的可见性时,它的行为也会有所不同。

在奥利奥之前,当从VISIBLE设置为GONE时,视图首先根据alpha从1渐隐到0,然后视图使用的位置将折叠。

对于Oreo和更高版本(我想我还没有在Android q上测试过),当从VISIBLE设置为GONE时,视图会在淡入淡出时折叠,对其他视图进行裁剪,因为alpha还没有设置为零。

我没有发现任何关于这个特殊情况的东西,只知道我必须通过定制我的视图来重新制作一些帖子上的动画。

我将在下面回答我自己。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-06 16:44:33

所以我创建了我的自定义视图,经过大量的调试之后,我发现我需要覆盖setAlpha方法:

代码语言:javascript
运行
复制
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?) {}
                    })
        }
    }
}

您还必须在您的代码中更改可见性的动画的其他部分:

代码语言:javascript
运行
复制
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

由于有许多条件,这可能不是最好的方法,但同样,我没有找到其他任何东西,而且这种方法工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57372158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档