从其名字就可知道,帧动画是由一些列的图片按顺序播放出来,但是比较容易引起OOM,所以要避免使用过多尺寸较大的图片。
不同于View动画,帧动画使用的是AnimationDrawable类。
res/drawable包
XML定义动画:
启动动画:
mImageView.setBackgroundResource(R.drawable.frame_animation);
AnimationDrawable drawable= (AnimationDrawable) mImageView.getBackground();
drawable.start();
也叫View动画,主要有AlphaAnimation、 ScaleAnimation、 TranslateAnimation、 RotateAnimation四种,代码实现上也都差不多。
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(2000L);
mImageView.startAnimation(aa)
TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 200);//参数分别为fromX,toX,fromY,toY
ta.setDuration(2000L);
mImageView.startAnimation(au);
//左上角为旋转中心
RotateAnimation ra = new RotateAnimation(0, 360, 100, 100);
//view的中心为旋转中心
RotateAnimation raa = new RotateAnimation(0, 180, RotateAnimation.RELATIVE_TO_SELF, 0.5F, RotateAnimation.RELATIVE_TO_SELF, 0.5F);
raa.setDuration(2000L);
mImageView.startAnimation(raa);
//左上角缩放起点
ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2);
//view的中心为缩放起点
ScaleAnimation saa = new ScaleAnimation(0, 2, 0, 2, ScaleAnimation.RELATIVE_TO_SELF
, 0.5F, ScaleAnimation.RELATIVE_TO_SELF, 0.5F);
saa.setDuration(2000L);
mImageView.startAnimation(saa);
res/anim包
XML动画的引用:
Animation au = AnimationUtils.loadAnimation(this, R.anim.tarnslation_x_anim);
mImageView.startAnimation(au);
方式一:
AnimationSet as = new AnimationSet(true);//true表示共享插值器
as.setDuration(2000L);
as.addAnimation(aa);
as.addAnimation(ta);
mImageView.startAnimation(as);
方式二就是前面的
xml形式。
自定义View动画主要涉及到数学上的矩阵变换,有时候还需要借助 Camera来简化矩阵变换。然而在实际开发中使用的较少,大体了解下其原理步骤即可。
//属性:translateX,translateY,scaleX,scaleY
ObjectAnimator oa = ObjectAnimator.ofFloat(mImageView, "translationX",300F);// 到300
oa.setDuration(2000L);
oa.start();
ObjectAnimator oa2 = ObjectAnimator.ofFloat(mImageView, "scaleX", 2);
oa2.setDuration(1000L);
oa2.start();
res/animator包
单动画:
多动画按顺序或者同时启动:
XML动画的引用:
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.translation_y_animator);//加载文件
animator.setTarget(mImageView);//关联view
animator.start();
AnimatorSet aSet = new AnimatorSet();
//aSet.play(oa);//只启动一个动画
//aSet.playTogether(oa, oa2);//同时启动多个动画
//aSet.playSequentially(oa,oa2);//先后依次启动
//aSet.play(oa).after(oa2);//可以设置同时启动,先于、后于启动
//aSet.play(oa).after(3000L);//after可以设置启动时间
aSet.play(oa).after(3000L).after(oa2);//先启动oa2,然后经过3000L-oa2消耗的时间,再启动oa
aSet.start();
还可以通过新增的API实现动画集,但是不能设置先后顺序;通过XML方式可以实现先后顺序。
Builder的设计模式。
// 动画都是同步执行的
mImageView.animate().setDuration(2000L).y(400).alpha(0.5F).start();
//绕X轴旋转,没设置动画结束后停止
mImageView.animate().setDuration(2000L).rotationX(360F).scaleX(2)
.withStartAction(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "动画开始了", Toast.LENGTH_SHORT).show();
}
})
.withEndAction(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "动画结束", Toast
.LENGTH_SHORT).show();
}
});
}
})
.start();
//再次启动会停止之前的,也就是可以重复启动该动画
//mImageView.animate().rotationXBy(360).setDuration(3000).start();//360表示360度,一圈
//mImageView.animate().yBy(50).start();
//mImageView.animate().zBy(150).start();//垂直桌面,API要求21.