一、概述
在之前基础用法的文章中,我们介绍了使用crossFade
来进行placeHolder
和要加载的图片之间渐进渐出的动画,今天,我们来介绍一个更加高级的用法 - animate()
。
animate
有以下两个重载方法,我们可以给它指定一个R.anim
下的动画资源文件,或者传入一个实现了ViewPropertyAnimation.Animator
接口的实例,来自定义自己的动画。
public DrawableRequestBuilder<ModelType> animate(int animationId)
public DrawableRequestBuilder<ModelType> animate(ViewPropertyAnimation.Animator animator)
二、示例
2.1 在xml
中定义动画
在xml
中使用自定的动画很简单, 首先,我们在R.anim
文件夹下定义一个动画资源文件,R.anim.glide_animate
复制代码
然后,我们调用animate
把这个资源文件的id
传进去,这样,当图片加载完成之后,就会以一个慢慢放大且渐显的方式出现了。
public void loadAnimate(View view) { Glide.with(this) .load("http://i.imgur.com/DvpvklR.png") .diskCacheStrategy(DiskCacheStrategy.NONE) .animate(R.anim.glide_animate) .into(mImageView); }复制代码
2.2 通过ViewPropertyAnimation.Animator
定义动画
当我们的容器是一个ImageView
时,用上面的方式是最方便的。然后回想一下,之前我们介绍过的自定义Target
文章中,我们谈到了ViewTarget
,也就是我们定义了一个自定义的View
,那么这时候如果我们希望这个自定义View
中的各个组件可以用不同的动画方式展现出来,那么上面这种用xml
定义动画执行过程就不适用了,下面我们展示一下继承于ViewPropertyAnimation.Animator
来进行动画。
private class MyAnimator implements ViewPropertyAnimation.Animator { @Override public void animate(View view) { final View finalView = view; ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); finalView.setScaleX((float) (0.5 + 0.5 * value)); finalView.setScaleY((float) (0.5 + 0.5 * value)); finalView.setAlpha(value); } }); valueAnimator.start(); } }复制代码
然后,我们实例化一个MyAnimator
,通过animate()
传入:
public void loadAnimator(View view) { MyAnimator myAnimator = new MyAnimator(); Glide.with(this) .load("http://i.imgur.com/DvpvklR.png") .diskCacheStrategy(DiskCacheStrategy.NONE) .animate(myAnimator) .into(mImageView); }复制代码