【问题标题】:Bizarre Alpha Animation Issue on a View inside a FrameLayoutFrameLayout 内的视图上出现奇怪的 Alpha 动画问题
【发布时间】:2014-11-22 04:57:28
【问题描述】:

我正在构建一个看起来像这样的组件:

<FrameLayout>
  // The following two are added programmatically during construction
  <View> // match-parent in both dimensions, act as an overlay
  <RelativeLayout> // Bar across the top of the component, e.g. notification bar type thing

  // User's content goes here

</FrameLayout>

这个想法是用户将自定义 FrameLayout 放置在某处并填充内容,当它被构建时,它将以编程方式添加一个具有零 alpha 的 View 覆盖整个布局,然后是一个短而宽的栏顶部用于警报/通知。当触摸警报栏以展开时,覆盖层的 alpha 将动画到 50% 左右,以使无法触摸的区域变灰。就像DialogFragment 显示时屏幕的其余部分如何变灰一样。

最初的叠加很简单,例如:(为简洁起见,省略了一些关键字)

<View alpha="0.0"/>

然后就膨胀了。

FrameLayout的类中,我创建了几个动画:

AlphaAnimation fadeInAnimation = new AlphaAnimation(0.0f, 0.5f);
AlphaAnimation fadeOutAnimation = new AlphaAnimation(0.5f, 0.0f);
...
// in some initialization code I put in a couple of extra details
fadeInAnimation.setFillAfter(true);
fadeInAnimation.setDuration(500);
fadeOutAnimation.setFillAfter(true);
fadeOutAnimation.setDuration(500);

当触摸动作发生时,我只是将它们称为overlay.startAnimation(fadeInAnimation)

奇怪的行为是,如果叠加层被初始化为一些小的 alpha,动画不会做任何事情。我可以验证它至少被调用了,但 alpha 保持不变。

但是,如果我将叠加层的 alpha 保留为其默认值 1.0,并在构造时将其可见性设置为 INVISIBLE,则动画将正确触发。如果起始 alpha 为 0.6 之类的,这也适用。 fadeInAnimation 捕捉到 0 alpha 并将其提高到 0.5,然后其余部分正常运行。

我还没有测试过 alpha 中断的位置是否有一些下限,或者动画的范围与哪些值无效之间是否存在某种关系。

有什么想法吗?

【问题讨论】:

  • @StoneBird 看起来我没有正确搜索。这似乎不直观。如果您想将其发布为答案,我会给您赏金。
  • 见贴。并添加了一条建议。

标签: android android-layout


【解决方案1】:

正如链接答案here中所引用的:

问题出在 android:alpha="0" 中。此属性设置透明度 一个视图 http://developer.android.com/reference/android/view/View.html#attr_android:alpha

当 alpha 属性等于 0 时,动画会发生变化 透明度从 0*0.0f=0 到 0*1.0f=0。当 alpha 属性设置为 1 然后动画将透明度从 1*0.0f=0 更改为 1*1.0f=1。 这就是为什么在第一种情况下您看不到文字而在第二种情况下 一切都按预期进行。

同时我还建议您尝试AnimatorObjectAnimator 对象,它们是简单的xml 文件,通常存储在您的animator 文件夹中。它支持多个属性,我认为它以直观的方式为属性设置动画。也就是说,如果您希望它从 0 变为 1 的动画,它将直接将属性从 0 更改为 1。

示例代码

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:valueFrom="0"
        android:valueTo="1"
        android:propertyName="alpha"
        android:duration="@android:integer/config_shortAnimTime" />
</set>

【讨论】:

  • 感谢您的快速回复。计时器到时会奖励。
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多