84

我有动画:

<set xmlns:android="http://schemas.android.com/apk/res/android"  
   android:interpolator="@android:anim/linear_interpolator">  
   <alpha  
       android:fromAlpha="0.2"  
       android:toAlpha="1.0"  
       android:duration="500"/>  
</set>

ImageView

<ImageView
    android:id="@+id/listViewIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/settings" 
    android:alpha="0.2"/>  

和代码:

final Animation anim = AnimationUtils.loadAnimation(this, R.anim.alpha);
final ImageView iv = (ImageView) findViewById(R.id.listViewIcon);
anim .setFillAfter(true);
iv.startAnimation(anim);

所以一开始我有ImageViewalpha 0.2,最后我想有ImageViewalpha 1。但它不是那样工作的 - 当动画开始时添加更多 alpha 并且动画以 alpha 结束0.2

我必须改变什么才能使我的图像动画从0.2up 到1

我检查了不同的设置 - 我设置了android:alpha="1.0", fromAlpa="1.0"toAlpha="0.2"它像我预期的那样工作 - 从 alpha10.2. 看起来 alpha fromImageView乘以动画中的 alpha ...

4

10 回答 10

114

尝试这个

AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
animation1.setFillAfter(true);
iv.startAnimation(animation1);
于 2013-12-17T08:13:01.130 回答
52

可能有点晚了,但在 android 文档中找到了一个可爱的解决方案。

//In transition: (alpha from 0 to 0.5)
view.setAlpha(0f);
view.setVisibility(View.VISIBLE);
view.animate()
   .alpha(0.5f)
   .setDuration(400)
   .setListener(null);

//Out transition: (alpha from 0.5 to 0)
view.setAlpha(0.5f)
view.animate()
   .alpha(0f)
   .setDuration(400)
   .setListener(new AnimatorListenerAdapter() {
           @Override
           public void onAnimationEnd(Animator animation) {
           view.setVisibility(View.GONE);
         }
    });
于 2018-09-02T18:33:33.167 回答
39

Kotlin Version

像这样简单地使用ViewPropertyAnimator

iv.alpha = 0.2f
iv.animate().apply {
    interpolator = LinearInterpolator()
    duration = 500
    alpha(1f)
    startDelay = 1000
    start()
}
于 2018-10-27T10:30:50.950 回答
18

1在开始动画之前将 alpha 设置为对我有用:

AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(500);
iv.setAlpha(1f);
iv.startAnimation(animation1);

至少在我的测试中,没有闪烁,因为在开始动画之前设置了 alpha。它工作正常。

于 2016-06-07T08:09:30.340 回答
3

这是我的扩展,这是使用 FadIn 和 FadOut 更改图像的示例:

fun ImageView.setImageDrawableWithAnimation(@DrawableRes() resId: Int, duration: Long = 300) {    
    if (drawable != null) {
        animate()
            .alpha(0f)
            .setDuration(duration)
             .withEndAction {
                 setImageResource(resId)
                 animate()
                     .alpha(1f)
                     .setDuration(duration)
             }

    } else if (drawable == null) {
        setAlpha(0f)
        setImageResource(resId)
        animate()
            .alpha(1f)
            .setDuration(duration)
    }
}
于 2020-07-30T21:59:31.940 回答
2

嗯……

事情是错误的,可能在Android API中动画的正确操作。

事实是,当您在代码中设置 alpha 值 0.2f 时,它是基于 xml 文件中针对 android 的设置,这意味着:

0.2f = 0.2f of 0.2f (20% from 100%) ie from 0.2f / 5 = 0.04f
1f = 0.2f

所以你的动画实际上是从 0.04f 到 0.2f

flagsetFillAfter(true)确实有效,但是您需要了解,在动画结束时,ImageViewalpha 值将是0.2f而不是 1,因为您将 0.2f 指定为动画中可接受的值(一种最大 alpha 通道)。

因此,如果您想要获得所需的结果,应将所有逻辑带到您的代码中,并在代码中操作动画,而不是在 xml 中确定。

您应该了解您的动画直接取决于两件事:

  • 动画视图的LayoutParams
  • 动画参数。

动画参数在setFillAfter\setFillBefore方法中操作您的 LayoutParams。

于 2015-03-07T14:02:42.760 回答
2

" setStartOffset" 应该更小,否则动画从视图 alpha 开始0.xf并在动画到1f. 希望以下代码有所帮助。

AlphaAnimation animation1 = new AlphaAnimation(0.1f, 1f);

animation1.setDuration(1000);
animation1.setStartOffset(50);

animation1.setFillAfter(true);

view.setVisibility(View.VISIBLE);

view.startAnimation(animation1);
于 2018-04-18T20:29:37.330 回答
1
<ImageView
    android:id="@+id/listViewIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/settings"/>  

android:alpha=0.2从 XML-> ImageView 中删除。

于 2015-03-07T13:40:42.683 回答
0
View.setOnTouchListener { v, event ->
    when (event.action) {
        MotionEvent.ACTION_DOWN -> {
            v.alpha = 0f
            v.invalidate()
        }
        MotionEvent.ACTION_UP -> {
            v.alpha = 1f
            v.invalidate()


        }
    }
    false
}
于 2020-04-08T14:23:28.007 回答
0
fun View.toggleAlpha(isShow: Boolean, delay: Long = 200, invisibleMode: Int = View.GONE) {
    if (isShow) animateAlpha(View.VISIBLE, delay) else animateAlpha(invisibleMode, delay)
}

fun View.animateAlpha(visibility: Int, delay: Long = 200) {
    if (visibility == View.VISIBLE) {
        setVisibility(View.VISIBLE)
    }

    val alpha = when (visibility) {
        View.GONE, View.INVISIBLE -> 0f
        View.VISIBLE -> 1f
        else -> 1f
    }

    animate().apply {
        duration = delay
        alpha(alpha)
        withEndAction {
            setVisibility(visibility)
        }
    }
}
于 2021-05-25T07:39:06.923 回答