话不多说,先看实现效果:
实现思路:
1、背景明显是采用gridview布局,每个item布局的最上层加上一个灰色透明遮罩层。
2、动画效果是从暗到亮再重亮到暗。
看到动画的第一眼可能先想到的是使用渐变透明度的动画,通过AnimationSet加入两个渐变透明度动画,一个是由暗到亮,另一个是由亮到暗,结果发现动画衔接的效果不好(当第一个动画执行完后恢复到原来状态以后第二个动画才开始,效果就变成了由暗->亮->暗->亮->暗)。此路不可行,必须另辟蹊径,通过setImageAlpha()方法动态修改遮罩层的透明度来实现这个效果,同时,还需要监听动画的过程,在动画完成以后随机再启动下一个动画,如何监听呢?这里我们使用属性动画ValuAnimator的addUpdateListener来实现,关键代码如下所示:
private void performAnimate(final ImageView target){
isFirstStart = false;
ValueAnimator valueAnimator = ValueAnimator.ofInt(0,255);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
private int image_alpha = 255;
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int currentValue = (int) animation.getAnimatedValue();//当前动画执行了多少
float fraction = currentValue / 255f;//动画占整个动画的比重
if(fraction<=0.5f){
//透明度由不透明到透明(即由暗到亮的过程)
if(image_alpha - 7 >= 0){
image_alpha -=7;
}
}else{
//透明度由透明到不透明(即由亮到暗的过程)
if(image_alpha +7 <= 255){
image_alpha +=7;
}
}
if(Build.VERSION.SDK_INT <= 15){
target.setAlpha(image_alpha);
}else{
target.setImageAlpha(image_alpha);
}
target.invalidate();//刷新界面
if(currentValue == 255){
nextPos = random.nextInt(coverPicMap.size());//下一个动画位置
while(nextPos == currentPos){
//下一次动画位置相同时再取随机数,直到不同为止,防止同一个位置连续出现2次动画
nextPos = random.nextInt(coverPicMap.size());
break;
}
currentPos = nextPos;
performAnimate(coverPicMap.get(nextPos));
}
}
});
valueAnimator.setDuration(5000).start();
}
3、随机播放动画,使用随机函数Random随机抽取动画位置。
源码下载地址:http://download.csdn.net/detail/lmz14/8890305