前提条件:
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?
本问题由张小飞的提问
更多问答 >>
-
【大家提问】Android中的匿名binder与线程相关的一些问题
2022-07-03 10:48 -
每日一问 View.post 又来了与View.postOnAnimation 有什么区别?
2022-07-03 10:47 -
大家提问 Android中前后台切换监听,如果涉及到多进程如何完美的解决?
2022-12-04 22:50 -
2022-11-08 21:50
-
2022-11-08 21:50
-
2022-05-27 20:55
-
每日一问 | Service onStartCommand 返回STICKY是如何做到被拉活的?
2022-07-24 11:50 -
2022-05-06 11:37
-
每日一问 | 可以不借助 bindService,实现跨进程 binder 通信吗?
2022-04-27 23:43
这个问题应该从动画的本质出发。一种是视图动画,一种是属性动画。视图动画的原理:就好像是动画引擎在屏幕上复制了一份View的视图,然后执行动画。属性动画的原理:操作真正的View对象。你上面说的那个问题,不是View没有被GONE,而不可见。而是你执行的是视图动画,动画引擎渲染了一份新的View视图。原本的View视图此时被隐藏了,直到动画结束才恢复到隐藏前的状态。
亲测有效,使用 ValueAnimator 设置 View的缩放属性,前,先设置 View.visibility = GONE ,View 会直接 GONE。 不会出现先执行动画,后gone的效果 ...查看更多
亲测有效,使用 ValueAnimator 设置 View的缩放属性,前,先设置 View.visibility = GONE ,View 会直接 GONE。 不会出现先执行动画,后gone的效果。 亲测有效。
这俩是等价的吗?
View.isVisible 是 Core-Ktx 对 View 的扩展: visibility = if (boolean) View.VISIBLE else View.GONE ...查看更多
View.isVisible 是 Core-Ktx 对 View 的扩展: visibility = if (boolean) View.VISIBLE else View.GONE