我正在Android中的两个活动之间进行淡入/淡出动画。这两项活动都有白色背景(Holo灯光主题)。我在淡入的活动中将alpha
从0更改为1,在淡出的活动中从1更改为0.
我的问题是感知的背景颜色在动画中不是恒定的,我觉得这很烦人。也就是说,背景变暗然后在动画的持续时间内变亮。所以在动画中间,背景不是白色,而是中灰色。
我想使用两个插值器,使得两者的组合效果给出恒定的背景颜色。我认为linear
插值器可以解决问题,因为它们保持两个alpha的总和不变。但它不起作用:动画期间背景颜色会发生变化。标准accelerate
和decelerate
也没有我想要的行为。
所以,我的问题是:是否有任何已知的插值器(可能accelerate
,decelerate
具有一定的速率),在淡入/淡出动画中提供恒定的背景颜色?
答案 0 :(得分:1)
从评论中,您可能想要为活动中的视图设置动画,而不是活动本身。您可以使用droidQuery库执行此操作。只需将其设置为onPause()
方法:
@Override
public void onPause() {
//here, substitute mainView with the id of your background
$.with(this, R.id.mainView).selectChildren().selectAll().animate("{ alpha : 0.0f }", 400, $.Easing.LINEAR, $.noop());
super.onPause();
}
这将选择您背景的所有视图,并使用ObjectAnimator
,线性插值和400毫秒持续时间将其Alpha值设置为0。
您还需要覆盖onResume()
:
@Override
public void onResume() {
//here, substitute mainView with the id of your background
$.with(this, R.id.mainView).selectChildren().selectAll().animate("{ alpha : 1.0f }", 400, $.Easing.LINEAR, $.noop());
super.onResume();
}
这恰恰相反 - 从0 alpha动画到1。
答案 1 :(得分:0)
我明白了!
简短回答:消除两个动画中的一个。从主要活动到次要活动时,仅使用淡入。从次要活动到主要活动时,只使用淡出。详情和解释如下。
有两种方法可以将两种颜色与alpha值组合在一起。该过程称为“alpha compositing”。一种天真的组合方式是不常用的组合方式:
(a)C = C1 *α1+ C2 *α2
如果应用了这种组合方法,那么alpha1
和alpha2
使用两个线性插值器会在C1
和C2
等于“背景”时给出恒定颜色“颜色Cbg
。具体来说,如果alpha1 = t
(其中t
表示时间),alpha2 = 1-t
和C1 = C2 = Cbg
,则组合(a)会给出C = Cbg*t + Cbg*(1-t) = Cbg
。也就是说,复合颜色C
等于Cbg
,而不考虑t
。
然而,似乎Android正在应用的组合是所谓的“over”运算符:
(b)C = C1 *α1+ C2 *α2*(1-α1)
其中带有C1
的颜色为C2
的像素 over 。使用组合方法(b),为了获得C
像素的恒定颜色C1 = C2 = Cbg
,alpha2 = 1
就足够了,因为C = Cbg*alpha1 + Cbg*1*(1-alpha1) = Cbg
。
因此,对于 over 和1
(无动画)的活动,插值器应为任何(线性或其他)<下EM>
由于我不确定Android如何决定哪个活动结束以及哪个活动已经完成,我做了一些实验并发现:
当主要活动创建次要活动时,适当的程序是使用淡入插补器进行次要活动。
当辅助活动返回主活动时,适当的程序是为辅助活动设置淡出插补器。
所以看起来Android正在考虑次要活动是在主要活动上。这是有道理的,因为次要是由主要创建的。
0
就足够了,即使用overridePendingTransition(R.anim.fadein, 0)
。但是,我发现这只会有效。为了使它工作,我需要定义一个“假”淡入淡出,从alpha 1.0到alpha 1.0(这样它实际上什么都不做)并使用overridePendingTransition(R.anim.fadein, R.anim.fakefade)
。至于需要假动画而不是0
动画,我没有解释。
我希望Android文档更加清晰。这本来可以节省我一段时间。