使用Alpha淡入淡出动画制作Android中闪烁的图像

45

我已经苦苦挣扎了几天,最后决定来求助。这个问题应该非常简单,我一定是错过了一些非常基础的东西。

我有一个包含图像定义的XML布局页面。我有两个anim XML页面,一个用于将alpha从0更改为1,另一个用于将alpha从1更改为0,以创建"闪烁"效果。因此,alphaAnimation在XML中定义,我只需要调用它即可。

图像出现了,但没有循环闪烁效果。

public class blinker extends Activity {

   //create name of animation
Animation myFadeInAnimation;
Animation myFadeOutAnimation;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.scanning_view);

 //grab the imageview and load the animations
    ImageView myImageView = (ImageView) findViewById(R.id.blinkingView01); 
    Animation myFadeInAnimation = AnimationUtils.loadAnimation(null, R.anim.fade_in);
    Animation myFadeOutAnimation = AnimationUtils.loadAnimation(null, R.anim.fade_out);

//fade it in, and fade it out. 
    myImageView.startAnimation(myFadeInAnimation);
    myImageView.startAnimation(myFadeOutAnimation);
     }
}   

在Anim资源中有两个XML动画布局:

<?xml version="1.0" encoding="UTF-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <alpha android:fromAlpha="0.0" 
    android:toAlpha="1.0" 
    android:interpolator="@android:anim/accelerate_interpolator"  
    android:duration="50" android:repeatCount="infinite"/> 
 </set> 

而另一个是:

 <?xml version="1.0" encoding="UTF-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0" 
    android:interpolator="@android:anim/accelerate_interpolator"  
    android:duration="1000" android:repeatCount="infinite"/> 
</set>

1
嗨,Charlie,喜欢你的节目。 :) 我编辑了原始帖子,添加了两个 XML 文件(fade_in.xml 和 fade_out.xml)。 - Keith
4个回答

107

实现淡入淡出效果的最佳方法是:

ImageView myImageView = (ImageView) findViewById(R.id.imageView2); 
Animation myFadeInAnimation = AnimationUtils.loadAnimation(Splash.this, R.anim.tween);
myImageView.startAnimation(myFadeInAnimation);

在你的res/anim/目录下创建tween.xml文件,其中定义一个1秒钟的补间动画,从不透明度0开始到不透明度1,并且设置无限循环反转。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
    android:fromAlpha="0.0"
    android:toAlpha="1.0"
    android:duration="1000" 
    android:repeatMode="reverse"
    android:repeatCount="infinite" />
</set>

3
对我来说有效!!我将 fromAlpha 保留为0.2,以便视图不会完全消失。感谢Buchs,点赞+1。 - Shraddha
对我来说,它只重复了一次:进去和出来。然后就什么也没做。 - brainmurphy1
2
@brainmurphy1 也许你忘记了 android:repeatCount="infinite"。重复次数需要是正数或无限大。 - Ben Kane
代码运行良好。但我想将此动画设置为定时器,以便每秒闪烁一次。但由于淡入淡出效果,它需要更长的时间才能完成一秒钟的循环。我将持续时间从1000更改为500、600等,但无法获得准确的时间。请问在定时器情况下,持续时间应该是多少? - User

35

为什么不使用android:repeatMode="reverse"呢?


仍然是同样的问题。屏幕显示出来,但没有动画效果。 - Keith
为什么你的第一个参数是null而不是this,例如:nimationUtils.loadAnimation(null,...? - methodin
那是又一次迭代,我经历了很多次,包括另一个完全重写来为图像添加动画效果。最初我规定了“这个”。 - Keith
我需要休息一下,让酸痛的眼睛得到放松。在阅读了Methodin的回复后,我实施了两件事情,现在它已经可以正常工作了。非常感谢。 - Keith
方法名,屏幕和键盘时间太长了。 :) 当我回到“this”时,上面的迭代起作用了。我决定不使用repeatMode =“reverse”,这样我就可以更精细地控制淡入和淡出速度,因为每个速度可以独立设置。例如快速淡入,慢速淡出。 - Keith

17

您可以使用以下 alpha 动画来为 Android 视图设置闪烁效果。

blinkanimation= new AlphaAnimation(1, 0); // Change alpha from fully visible to invisible
blinkanimation.setDuration(300); // duration
blinkanimation.setInterpolator(new LinearInterpolator()); // do not alter animation rate
blinkanimation.setRepeatCount(3); // Repeat animation infinitely
blinkanimation.setRepeatMode(Animation.REVERSE);

接下来,像这样将动画添加到视图中:

view.setAnimation(blinkanimation); 
或者
view.startAnimation(blinkanimation);

如何在这个方法中更改持续时间? - Hamid
1
更改闪烁动画的持续时间,请调用blinkanimation.setDuration(你的持续时间)。@Hamid - KarthikKPN
LinearInterpolator是默认的,不需要显式设置它。 - YTerle
无限动画的重复次数不是应该为“-1”吗? - natinusala
1
@natinusala 是的。anim.setRepeatCount(Animation.INFINITE);或者 ...(-1); - O-9

7
如果有人决定使用编程版本:
val anim = AlphaAnimation(1.0f, 0.0f)
anim.duration = 750
anim.fillAfter = true  

// here is repeat settings
anim.repeatMode = AlphaAnimation.REVERSE // ping pong mode
anim.repeatCount = 1 // count of repeats

yourView.startAnimation(anim)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接