0

我在 Android 的两个活动之间做一个淡入/淡出动画。这两项活动都有白色背景(全息灯主题)。我alpha在淡入的活动中从 0 变为 1,在淡出的活动中从 1 变为 0。

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

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

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

4

2 回答 2

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 的动画。

于 2013-08-16T17:23:50.297 回答
0

我知道了!

简短的回答:消除两个动画之一。从主要活动转到次要活动时,仅使用淡入。从次要活动转到主要活动时,仅使用淡出。详细信息和解释如下。

有几种方法可以将两种颜色与 alpha 值结合起来。该过程称为“阿尔法合成”。一种不常用的组合方式是:

(a) C = C1*alpha1 + C2*alpha2

如果应用了该组合方法,则使用两个线性插值器alpha1alpha2将给出一个恒定的颜色,只要两者C1C2等于“背景”颜色Cbg。具体来说,如果alpha1 = t(其中t表示时间)alpha2 = 1-tC1 = C2 = Cbg,则 (a) 的组合给出C = Cbg*t + Cbg*(1-t) = Cbg。即,根据需要,合成颜色与C无关。Cbgt

但是,Android 应用的组合似乎是所谓的“over”运算符:

(b) C = C1*alpha1 + C2*alpha2*(1-alpha1)

认为有颜色的C1像素超过C2。使用组合方法 (b),为了获得C像素的恒定颜色,C1 = C2 = Cbg就足够了alpha2 = 1,因为C = Cbg*alpha1 + Cbg*1*(1-alpha1) = Cbg.

因此,对于结束的活动,插值器应该是任何(线性或其他),对于.1

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

  • 当主要活动创建次要活动时,适当的过程是为次要活动使用淡入内插器。

  • 当次要活动回到主要活动时,适当的过程是为次要活动设置淡出内插器。

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

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

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

我希望 Android 文档对此更清楚。这会为我节省不少时间。

于 2013-08-17T09:36:14.650 回答