淡入/淡出,在动画中保持恒定的背景色

时间:2013-08-16 16:40:28

标签: android android-animation alpha

我正在Android中的两个活动之间进行淡入/淡出动画。这两项活动都有白色背景(Holo灯光主题)。我在淡入的活动中将alpha从0更改为1,在淡出的活动中从1更改为0.

我的问题是感知的背景颜色在动画中不是恒定的,我觉得这很烦人。也就是说,背景变暗然后在动画的持续时间内变亮。所以在动画中间,背景不是白色,而是中灰色。

我想使用两个插值器,使得两者的组合效果给出恒定的背景颜色。我认为linear插值器可以解决问题,因为它们保持两个alpha的总和不变。但它不起作用:动画期间背景颜色会发生变化。标准acceleratedecelerate也没有我想要的行为。

所以,我的问题是:是否有任何已知的插值器(可能acceleratedecelerate具有一定的速率),在淡入/淡出动画中提供恒定的背景颜色?

2 个答案:

答案 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

如果应用了这种组合方法,那么alpha1alpha2使用两个线性插值器会在C1C2等于“背景”时给出恒定颜色“颜色Cbg。具体来说,如果alpha1 = t(其中t表示时间),alpha2 = 1-tC1 = 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 = Cbgalpha2 = 1就足够了,因为C = Cbg*alpha1 + Cbg*1*(1-alpha1) = Cbg

因此,对于 over 1(无动画)的活动,插值器应为任何(线性或其他)<下EM>

由于我不确定Android如何决定哪个活动结束以及哪个活动已经完成,我做了一些实验并发现:

  • 当主要活动创建次要活动时,适当的程序是使用淡入插补器进行次要活动。

  • 当辅助活动返回主活动时,适当的程序是为辅助活动设置淡出插补器。

所以看起来Android正在考虑次要活动是在主要活动上。这是有道理的,因为次要是由主要创建的。

  • 由于主要活动不必使用任何动画,因此根据documentation,将动画设置为0就足够了,即使用overridePendingTransition(R.anim.fadein, 0)。但是,我发现这只会有效。为了使它工作,我需要定义一个“假”淡入淡出,从alpha 1.0到alpha 1.0(这样它实际上什么都不做)并使用overridePendingTransition(R.anim.fadein, R.anim.fakefade)

至于需要假动画而不是0动画,我没有解释。

我希望Android文档更加清晰。这本来可以节省我一段时间。