Android动画Alpha


73

我有动画:

<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);

因此,一开始我要ImageView使用alpha 0.2,而最后我要ImageView使用alpha 1。但这不是那样的-动画开始时会添加更多的alpha,动画以alpha完成0.2

我有什么改变为从动画我的形象0.2最多1

我检查了不同的设置-我设置android:alpha="1.0"fromAlpa="1.0"toAlpha="0.2"它就像我的预期-从阿尔法10.2。看起来来自ImageView的alpha乘以来自动画的alpha ...


为了防止从视图跳跃在端回0.2α,使用fillAfter属性:developer.android.com/reference/android/view/animation/...
java的

事实并非如此。Alpha不会转到1。当我从1-> 0.2设置动画时,它可以正常工作并保持在0.2(我在之后使用fill)。当我想从0.2到1进行动画处理时,它逐渐变为几乎0并变为0.2
wioskamala 2013年

你设置fillEnabled为true了吗?
贾夫

Answers:


100

尝试这个

AlphaAnimation animation1 = new AlphaAnimation(0.2f, 1.0f);
animation1.setDuration(1000);
animation1.setStartOffset(5000);
animation1.setFillAfter(true);
iv.startAnimation(animation1);

从imageview属性中删除Alpha,并从设备中取消安装应用程序。清洁,重新构建并安装。由于它工作时我的身边
Vaibhav的阿加瓦尔

我不想删除Alpha-图片应使用Alpha 0.2淡化。Aplication做一些东西,当好了,我想有我影像动画阿尔法1
wioskamala

请在我的google nexus 4上检查编辑后的代码是否工作正常。我的imageview alpha开始时为0.2,但是在应用动画后,其更改为1.0,更改仍然存在。
Vaibhav Agarwal

1
我以不同的方式进行操作-而不是在布局中设置alpha或通过setAlpha / setImageAlpha设置动画,而是将动画设置为0.2-> 1并将其放在onCreate上。现在,当我的动画被触发时,它从0.2-> 1完美地变了
wioskamala 2013年

38

可能会晚一点,但是在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);
         }
    });

1
那就是我要寻找的东西
Radesh

效果很好,谢谢!不过,我只是想知道是否会.setListener(null);潜在地删除/干扰其他监听器,例如onClick / onTouch监听器?
Erlend KH

31

Kotlin Version

ViewPropertyAnimator像这样简单地使用:

iv.alpha = 0.2f
iv.animate().apply {
    interpolator = LinearInterpolator()
    duration = 500
    alpha(1f)
    startDelay = 1000
    start()
}

1
当尝试将beginDelayedTransition与ImageView.animate alpha动画混合时,这是唯一可行的解​​决方案。
编码约翰

2
是的 好答案!科特林万岁!
奥兹·沙巴特

18

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

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

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


这也对我有用(编辑:我的错误,我确实有XML干扰:android:alpha =“ 0”)。会稍微处理一下,但是我确实需要它从0开始,所以现在可以使用。谢谢。
the_dude_abides

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);

1

嗯...

这是错误的,并且可能是Android API中动画的正确操作。

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

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

因此,您的动画实际上有效 在0.04f到0.2f之间工作

标记setFillAfter(true)当然有效,但您需要了解动画结束时ImageView的alpha值为0.2f而不是1,因为您将0.2f指定为动画中的边际可接受值(一种最大的alpha通道)。

因此,如果要获得期望的结果,则应将所有逻辑带入代码中,并在代码中操纵动画,而不是在xml中确定。

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

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

动画参数在setFillAfter \ setFillBefore方法中操纵LayoutParams 。


是。你是对的。当我在代码中更改开始布局参数时,它就像一个魅力!


1

这是我的扩展名,这是使用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)
    }
}

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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.