帧动画 Frame
帧动画就是按照图片一定的顺序连续播放,gif图就是这个意思了。具体实现过程如下:
在资源文件目录下res/drawable创建anim.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<animation-list android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:duration="100" android:drawable="@mipmap/activity1" />
<item android:duration="100" android:drawable="@mipmap/activity2" />
<item android:duration="100" android:drawable="@mipmap/activity3" />
<item android:duration="100" android:drawable="@mipmap/activity4" />
</animation-list>
其中android:oneshot是指是否只执行一次意思,true为执行一次停止,false为循环播放动画.
item标签为每个帧的静态图片 ,android:duration为该图片停留时间,单位为毫秒。
用imageview作为动画载体,xml中定义一个imageview,在代码中执行如下:
imageView.setImageResource(R.drawable.anim);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
animationDrawable.start();
停止动画:
animationDrawable.stop();
属性动画 Property
控制属性来实现动画,位置发生真实改变。
1.ObjectAnimator实现动画
设置透明渐变:
ObjectAnimator alpha = ObjectAnimator.ofFloat(targetView, "alpha", 0f, 1f);
alpha.setDuration(2000);//设置动画时间
alpha.setInterpolator(new DecelerateInterpolator());//设置动画插入器,减速
alpha.setRepeatCount(-1);//设置动画重复次数,这里-1代表无限
alpha.setRepeatMode(Animation.REVERSE);//设置动画循环模式。REVERSE为动画到终点时反向执行
alpha.start();//启动动画。
设置缩放
ObjectAnimator animator
= ObjectAnimator.ofFloat(targetView, "scaleX", 1f, 2f, 1f);//scaleX代表X方向,scaleY代表Y方向
animator.setDuration(2000);
animator.start();
组合缩放
AnimatorSet animatorSet = new AnimatorSet();//组合动画
ObjectAnimator scaleX = ObjectAnimator.ofFloat(targetView, "scaleX", 1f, 0f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(targetView, "scaleY", 1f, 0f);
animatorSet.setDuration(2000);
animatorSet.setInterpolator(new DecelerateInterpolator()); //设置减速插补器
animatorSet.play(scaleX).with(scaleY);//两个动画同时开始 (可以多个)
animatorSet.start();
平移动画
ObjectAnimator translationUp = ObjectAnimator.ofFloat(targetView, "Y",
targetView.getY(), 0);
translationUp.setInterpolator(new DecelerateInterpolator());
translationUp.setDuration(1500);
translationUp.start();
旋转动画
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f, 0f);
animator.setDuration(2000);
animator.start();
2.一些属性
设置动画监听
anim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//开始监听
}
@Override
public void onAnimationEnd(Animator animation) {
//结束监听
}
@Override
public void onAnimationCancel(Animator animation) {
//动画被取消的监听
}
@Override
public void onAnimationRepeat(Animator animation) {
//动画被重复执行的监听
}
});
设置更新监听
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//value为你设定的变化的值
Float value = (float)animation.getAnimatedValue();
//根据变化的value值去更新
// view.postInvalidate();
// view.invalidate();
}
});
再xml中定义动画:res下创建一个animator文件夹
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:propertyName="alpha"
android:repeatCount="-1"
android:repeatMode="reverse"
android:valueFrom="0.5"
android:valueTo="1"
android:valueType="floatType" />
android:duration:动画持续时间;
android:propertyName:动画类型;
android:repeatCount:重复次数,-1为一直重复;
android:repeatMode:重复模式:reverse(从结束的位置继续), restart(从新开始);
android:valueFrom:起始值;
android:valueTo:结束值。
android:valueType:值类型
再java中调用
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.alpha);
animator.setTarget(imageView);
animator.start();
设置组合动画
动画效果:向左移动并旋转,然后回到原来的位置,接着向右移动并旋转,然后回到原来的位置
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<set>
<objectAnimator
android:duration="4000"
android:propertyName="rotation"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="360" />
<set android:ordering="sequentially">
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="200" />
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="200"
android:valueTo="0" />
</set>
</set>
<set >
<objectAnimator
android:duration="4000"
android:propertyName="rotation"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="360" />
<set android:ordering="sequentially">
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="-200" />
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="-200"
android:valueTo="0" />
</set>
</set>
</set>
set中的属性android:ordering:规定了这个set中的动画的执行顺序,包括:
together(默认):set中的动画同时执行
sequentially:set中的动画按顺序执行
属性动画大概就这么多了。如果是gif格式的话可以使用facebook的图片加载库Fresco非常简单
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
.setUri(Uri.parse(gifUrl))
.setAutoPlayAnimations(true)
.build();
if (aspectRatio > 0) {
simpleDraweeView.setAspectRatio(aspectRatio);
}
simpleDraweeView.setController(draweeController);