一.补间(View)动画Tween Animation:(平移,透明,旋转,缩放,动画集合).
创建方式2种
<1>.通过java代码创建补间动画:
//fromXType:
//Animation.RELATIVE_TO_SELF:0.5f--->控件自身x轴的起点值+0.5*自身的宽度
//Animation.RELATIVE_TO_PARENT,0.5f--->自身起点的值+0.5*控件父窗体的宽度
TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1.5f, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0);
//TranslateAnimation ta = new TranslateAnimation(0, 300, 0, -200);
ra.setDuration(3000); 动画的执行时间
ra.setRepeatCount(2); 设置重复的次数.
ra.setRepeatMode(Animation.REVERSE); RESTART重新开始/反转模式
ra.setFillAfter(true); 保持结束时的状态
ra.setInterpolator(new BounceInterpolator()); 特效
ivHouzi.startAnimation(ra); 开始动画
AlphaAnimation aa = new AlphaAnimation(0, 0.8f);
RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 1f, Animation.RELATIVE_TO_SELF, 1f);
ScaleAnimation sa = new ScaleAnimation(1, 2, 1, 3, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
动画集合:
TranslateAnimation ta = new TranslateAnimation(0, 300, 0, -200);
AlphaAnimation aa = new AlphaAnimation(0, 0.8f);
....
AnimationSet set = new AnimationSet(true); //参数:是否共用同一个插值器效果.
set.addAnimation(aa);
set.addAnimation(ta);
....
ivHouzi.startAnimation(set);
<2>.通过xml文件创建补间动画:
在res目录下建立一个anim文件夹,然后建立对应的xml文件.(translate/set)
android:duration="2000"
android:fromXDelta="0"
android:fromYDelta="0"
android:repeatCount="2"
android:interpolator="@android:anim/anticipate_overshoot_interpolator"
android:toXDelta="200"
android:toYDelta="200">
然后在代码中:
//补间动画资源引用的方式:
Animation ta = AnimationUtils.loadAnimation(this, R.anim.trans_animation);
ivHouzi.startAnimation(ta);
//动画监听
setAnimationListener(new AnimationListener() {
onAnimationStart//动画开始
onAnimationEnd //动画结束
if (ivA.getVisibility() == View.VISIBLE) {
ivA.setAnimation(null); 启动置空
showImageB();
ivB.startAnimation(sa2);
}else{
ivB.setAnimation(null);
showImageA();
ivA.startAnimation(sa2); }
onAnimationRepeat//动画重复
});```
二.帧动画Frame Animation:
可以顺序的播放排列好的图片,来实现类似电影的效果
步骤:
①.建立一个drawable-hdpi文件夹,放置多张图片;
②.在drawable目录,建立一个xml文件,该文件的根节点(类型),animation-list.
在这个文件中,写多个item:drawable和duration.
③.把这个xml文件作为某个控件的background.
④.在java代码中,AnimationDrawable drawable=(AnimationDrawable)iv.getBackground();
drawable.start();
三.属性动画(Property Animation):
通过改变控件自身的属性,来使得该控件动起来.
当属性动画移动后,如果不会到原来的位置,那么点击新的位置,将接受不到Click事件,点击原来的位置可以接收到点击事件
使用方法:
<1>.java代码创建:
ObjectAnimator oa = ObjectAnimator.ofFloat(ivShow, "translationX", 0, 200, 0, 300, 0, 400);
ObjectAnimator alpha = ObjectAnimator.ofFloat(ivShow, "alpha", 0, 0.2f, 0, 0.4f, 0, 0.8f, 1);
ObjectAnimator oaX = ObjectAnimator.ofFloat(ivShow, "rotationX", 0, 360, 0, -360);
ObjectAnimator oaX = ObjectAnimator.ofFloat(ivShow, "scaleX", 1, 4, 1, -4);
alpha.setRepeatCount(2);
alpha.setDuration(3000);
alpha.start();
属性动画的动画集合有多重方式:
AnimatorSet set = new AnimatorSet();
ObjectAnimator transX = ObjectAnimator.ofFloat(ivShow, "translationX", 0, 200, 0, 300, 0, 400);
ObjectAnimator alpha = ObjectAnimator.ofFloat(ivShow, "alpha", 0, 0.2f, 0, 0.4f, 0, 0.8f, 1);
//①.动画序列
//set.playSequentially(transX);
//set.playSequentially(alpha);
//②.动画集合.
// List list=new ArrayList<>();
// list.add(transX);
// list.add(alpha);
// set.playSequentially(list);
//③.playTogether
//set.playTogether(transX, alpha, rotateY, scaleX);
//④.
set.play(transX).with(alpha).after(rotateY).after(scaleX);
set.setDuration(4000);
set.start();
<2>.xml文件创建:
在res/文件夹下,创建一个animator文件夹,然后创建一个根节点(类型)是objectAnimator的xml文件.
//加载一个动画资源
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.trans_animator);创建xml文件
//动画的执行目标
animator.setTarget(ivShow);
//2秒后开始执行
//animator.setStartDelay(2000);
animator.start();
属性动画的监听方法:
①.监听动画的执行过程:
animator.addListener(new AnimatorListenerAdapter() {<---可选方法 不可选方法 ---> AnimatorListener
Statr/End/Canal/Repeat(Pause/Resume)
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
Toast.makeText(MainActivity.this, "平移完毕了", Toast.LENGTH_SHORT).show();
}
});
②.监听动画的取消过程:
//判断版本号
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//写数字也行19
//判断动画是否被取消了...
animator.addPauseListener(new Animator.AnimatorPauseListener() {
@Override
public void onAnimationPause(Animator animation) { }
@Override
public void onAnimationResume(Animator animation) { }
});
}
③.监听动画值的改变:
//Animator:"爷爷"
//ValueAnimator:"爹"--->ValueAnimator就相当于是一个"数值生成器".用来产生和管理动画运行时所需要的一些值.
//一般不产生具体的动画效果.
//ObjectAnimator:"孙子"--->在实际的开发过程中,用这个ObjectAnimator来实现具体的动画效果.
//ValueAnimator anim = new ValueAnimator();
ValueAnimator anim = (ValueAnimator) animator;
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
Log.i("TAG", "value=" + value);
}
});