登录

去注册 忘记密码?

登录

注册

去登录

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

注册

解锁回答区域

  • 扫码关注公众号
  • 发送“我爱安卓

若你登陆,将永久解锁;
若未登录,仅本机解锁。

解锁回答区域

获取注册验证码

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

【大家提问】为什么View.GONE效果不优先生效呢?

鸿洋    2022-05-13 21:53   收藏

前提条件:
mView为VISIBLE状态
执行:

  private fun startHideAnimation() {
        mView.isVisible = false
        mView.startAnimation(AlphaAnimation(1.0f else 0.0f).apply {
            //如果将fillAfter设置为true,即使为gone,也能接收到事件,分析下为啥?
            //            fillAfter = true
            duration = 250
        })
    }

现象:
view会先执行完动画完后才GONE
问题:
查看源码:
view.isVisible = GONE 会经历下面的流程

public void setVisibility(@Visibility int visibility) {
        setFlags(visibility, VISIBILITY_MASK);
    }


void setFlags(int flags, int mask) {
            //忽略部分代码

            if ((changed & GONE) != 0) {
                    requestLayout();

                    if (mParent instanceof View) {
                            // GONE views noop invalidation, so invalidate the parent
                            ((View) mParent).invalidate(true);
          }
            }
}

startAnimation会经历下面的流程:

public void setAnimation(Animation animation) {
                //忽略部分代码
        mCurrentAnimation = animation;
                invalidate(true)
}

而动画执行的时机是在draw()中的

applyLegacyAnimation()

但此时不是已经为GONE了吗,为啥仍然能够显示并执行完动画才消失呢。
其实把顺序调换了,现象也是一样。感觉跟view的绘制流程有关系,但无法分析透彻,请问why?

本问题由张小飞的提问

自助提问入口:点击提交问题

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定