2013-08-16 39 views
0

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

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

我想使用两个内插器,使得两者的组合效果都能产生恒定的背景色。我认为linear内插器会做的伎俩,因为他们保持两个alpha的总和不变。但它不起作用:在动画过程中背景颜色会发生变化。标准acceleratedecelerate也没有我想要的行为。

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

+0

你所描述的只是动画的工作原理。它听起来像你想要的只是动画一个,然后在动画完成后显示另一个。您可能需要编写一个自定义动画(在'XML'中才能正确使用)。 – Phil

+0

如果我只有一个(淡出),背景颜色将不可避免地从白色(alpha 1)变为黑色(alpha 0)。不是我想要的。 –

+0

所以如果我理解正确 - 你想要一个不变的背景颜色。那么你为什么要动画?看起来你应该在你想要的时间间隔内用你想要的颜色显示覆盖图。 – Phil

回答

0

我知道了!

简短回答:消除两个动画之一。从主要活动到次要活动时,只使用淡入。从中学到主要活动时,只使用淡出。详情和解释如下。

有两种方法可以将两种颜色与alpha值组合。该过程被称为“alpha compositing”。做组合中的一种简单的方式,这是中常用的方法,是:

的(a)C = C1 * ALPHA1 + C2 *α-2

如果已应用的组合方法如果C1C2等于“背景”颜色Cbg,则使用alpha1alpha2的两个线性内插器将给出恒定颜色。具体而言,如果alpha1 = t(其中t代表时间),alpha2 = 1-tC1 = C2 = Cbg,则组合(a)给出C = Cbg*t + Cbg*(1-t) = Cbg。也就是说,根据需要,复合颜色C等于Cbg而与t无关。

然而,看来这Android是应用组合是所谓的 “上” 操作符:

(B)C = C1 * ALPHA1 + C2 *α-2 *(1-α1)

其中可以认为与颜色C1像素是超过C2。使用组合方法(b),为了获得具有C1 = C2 = Cbg的像素的恒定颜色C,只需alpha2 = 1,因为那时C = Cbg*alpha1 + Cbg*1*(1-alpha1) = Cbg

所以内插器应该是任何针对作为超过1(没有动画),选择那些为下活性的活性(线性或其他方式)。

因为我不知道的Android如何决定哪些活动已经结束,这下,我做了一些实验,结果发现:

  • 当主活动产生的次要活动,充分程序为次要活动使用淡入式插入器。

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

所以它看起来像Android是考虑到次活动是在主一个。这是有道理的,因为辅助是由主辅助创建的。

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

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

我希望Android文档更清晰。它会为我节省相当一段时间。

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,直线插补,以及400ms的时间动画它们的α值设置为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阿尔法动画到1

+0

感谢您的答案。通过这种方法,两种活动的淡入淡出是同步的吗? –

+0

@LuisMendo我不确定,因为这些是视图动画,而不是活动转换动画,但是再加上一个活动动画('overridePendingTransition'),这应该提供一个非常接近你想要的效果。 – Phil

+0

我明白了。如果感兴趣,请看我自己的答案。所需的效果是通过使用_one_ alpha动画而不是两个来实现的。 –