Android(安卓)valueAnimator和ObjectAnimator浅谈(一)
16lz
2021-12-04
public class MainActivity extends AppCompatActivity {
TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView= (TextView) findViewById(R.id.tv); /** * valueAnimator 动画类 * ValueAnimator是整个属性动画机制当中最核心的一个类, * 属性动画的运行机制是通过不断地对值进行操作来实现的, * 而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。 * 它的内部使用一种时间循环的机制来计算值与值之间的动画过渡, * 我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长, * 那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果 */ ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,1); valueAnimator.setDuration(3000); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //显示出:0-1之间值的,每个值代表一个动画的一帧 System.out.println("============="+animation.getAnimatedValue()); } }); // valueAnimator.setStartDelay(1000);//动画播放延迟的时间 // valueAnimator.setRepeatCount(3);//动画模式播放的次数 //循环模式包括RESTART和REVERSE两种,分别表示重新播放和倒序播放的意思 // valueAnimator.setRepeatMode(ValueAnimator.RESTART); valueAnimator.start();
注:ValueAnimator.ofFloat(0,1),为什么就是返回的(0,1)之间的数据呢?那,我要怎么才能返回自己需要的数据呢?这个就是涉及到TypeEvaluator类了,后续会着重讲到这个接口。这是个重点,切记切记。
/** * ObjectAnimator 动画类 * 继承于valueAnimator 类 * ofFloat( Object target, String propertyName, float... values)的3个参数 * target:目标,例如:控件 * propertyName:属性,目标所具有的属性 * values:该属性对应的一系列值 */ //该textView 先淡出,在显示。因为设置的是:alpha属性。 ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f); objectAnimator.setDuration(6000); objectAnimator.start(); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //该textView旋转,先旋转360后,在旋转回来 ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"rotation",0f,360f,0f); objectAnimator.setDuration(6000); objectAnimator.start(); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //获取当前控件的水平位置 float currentX=textView.getTranslationX(); //该textView从当前位置,先向左平移500个单位,在平移回到当前位置。 ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"translationX",currentX,-500,currentX); objectAnimator.setDuration(5000); objectAnimator.start(); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // 该textView横向或者纵向拉伸 ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"scaleY",1f,3f,1f); objectAnimator.setDuration(3000); objectAnimator.start();
/** * 组合动画 * * 实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法, * 如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例, * AnimatorSet.Builder中包括以下四个方法: * after(Animator anim) 将现有动画插入到传入的动画之前执行 * after(long delay) 将现有动画延迟指定毫秒后执行 * before(Animator anim) 将现有动画插入到传入的动画之后执行 * with(Animator anim) 将现有动画和传入的动画同时执行 */ ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f); ObjectAnimator objectAnimator1=ObjectAnimator.ofFloat(textView,"rotation",0f,360f,0f); float currentX=textView.getTranslationX(); ObjectAnimator objectAnimator2=ObjectAnimator.ofFloat(textView,"translationX",currentX,-500,currentX); ObjectAnimator objectAnimator3=ObjectAnimator.ofFloat(textView,"scaleY",1f,3f,1f); ObjectAnimator objectAnimator4=ObjectAnimator.ofFloat(textView,"scaleX",1f,3f,1f); AnimatorSet animatorSet=new AnimatorSet(); animatorSet.play(objectAnimator) .after(objectAnimator2) .with(objectAnimator1) .with(objectAnimator3) .with(objectAnimator4); animatorSet.setDuration(5000); animatorSet.start();
/** * Animator监听器 * Animator类当中提供了一个addListener()方法,这个方法接收一个AnimatorListener,我们只需要去实现这个AnimatorListener就可以监听动画的各种事件了。 */ ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f); objectAnimator.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) { //动画重复 } }); /** * 是也许很多时候我们并不想要监听那么多个事件,可能我只想要监听动画结束这一个事件, * 那么每次都要将四个接口全部实现一遍就显得非常繁琐。没关系,为此Android提供了一个适配器类, * 叫作AnimatorListenerAdapter,使用这个类就可以解决掉实现接口繁琐的问题了. */ objectAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); } });}
}
更多相关文章
- Android拍照Demo
- 修改Android的开关机铃声、Android开关机画面与动画(附代码流程)
- android ImageView的scaleType属性
- Android中的注解
- Android手机号、串号获取
- 关于Android(安卓)相对布局中的属性 的介绍和运用
- android之布局xml各种控件属性详解
- Android(安卓)Wifi的一些属性
- android使用属性动画执行抖动效果