- 补间动画:定义开始和结尾,使用一种算法补全中间的位置
- 补间动画完成平移效果,并没有对控件的属性发生变化,只是视觉上的动画效果
- 属性动画:可以完全实现补间动画的所有效果.还有很多可以实现的.
- 针对他的属性发生变化
- 属性动画完成平移,真是的改变了 控件的属性,发生真实的动画效果
- 属性动画的两个重要的类:ValueAnimator、ObjectAnimator
- 属性动画中的ValueAnimator ---
-
private void valueAnimator() { // 属性动画中第一个比较重要的类,值的变化,值动画 // ValueAnimator valueAnimator = new ValueAnimator(); // valueAnimator.setIntValues(1, 2, 3, 4, 5); ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 4, 9); // ValueAnimator valueAnimator = ValueAnimator.ofFloat(1.0f, 3.0f); valueAnimator.setDuration(3000); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Object value = animation.getAnimatedValue(); Log.i(TAG, "onAnimationUpdate: " + new Date().toString() + "---" + value); } }); valueAnimator.start(); }
- 属性动画中的ObjectAnimator,特点:不仅仅可以作用在View上,还可以作用于普通的变量,只要这个变量的属性有setter方法就可以.
-
private void objectAnimator() { // 属性动画不仅仅可以作用在View上,还可以作用于普通的变量,只要这个变量的属性有setter方法就可以 Person p = new Person(); p.setName("zhangsan"); p.setAge(1); ObjectAnimator animator = ObjectAnimator.ofInt( p, "age", 1, 10 ); animator.setDuration(3000); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Object value = animation.getAnimatedValue(); Log.i(TAG, "onAnimationUpdate: " + value); } }); animator.start(); }
- 代码:
-
@Override public void onClick(final View v) { switch (v.getId()) { case R.id.btn_preview: Log.i(TAG, "开始前: " + imgShow.getTranslationX()); break; case R.id.btn_start: // valueAnimator(); // ObjectAnimator继承自ValueAnimator // ObjectAnimator objectAnimator = ObjectAnimator.ofArgb( // imgShow, // "backgroundColor", // Color.parseColor("#000000"), // Color.parseColor("#FFFFFF")); // // imgShow.setTranslationX(); // translateAnimator(); // alphaAnimator(); // scaleAnimator(); // rotationAnimator(); // 如果是使用属性动画的属性,必须在这个对象中存在set属性的方法 // ObjectAnimator objectAnimator = ObjectAnimator.ofFloat( // imgShow, // "errr", // 1, // 2 // ); // objectAnimator(); // animatorTranslation = ObjectAnimator.ofFloat( // imgShow, // "translationX", // 0, 500 // ); // animatorTranslation.setDuration(3000); // // 设置重复次数,重复一次代表走两次 // animatorTranslation.setRepeatCount(-1); // animatorTranslation.start(); ObjectAnimator ta = ObjectAnimator.ofFloat( imgShow, "translationX", 0, 1000 ); // 加速插值器 // ta.setInterpolator(new AccelerateInterpolator()); // 减速插值器 // ta.setInterpolator(new DecelerateInterpolator()); // 先加速后减速的插值器 // ta.setInterpolator(new AccelerateDecelerateInterpolator()); // 匀速插值器 // ta.setInterpolator(new LinearInterpolator()); // 回弹效果 // ta.setInterpolator(new AnticipateInterpolator()); // 阻尼效果 // ta.setInterpolator(new BounceInterpolator()); // 回环效果 // ta.setInterpolator(new CycleInterpolator(1)); ta.setDuration(5000); // 延时启动动画 ta.setStartDelay(2000); ta.start(); // ObjectAnimator ra = ObjectAnimator.ofFloat( // imgShow, "rotation", // 0, 360 // ); // ra.setDuration(3000); // ta.start(); // ra.start(); // Animation补间动画的动画类 // // Animator 属性动画的动画类 // 组合动画 // AnimatorSet set = new AnimatorSet(); // // 两个动画一起进行 //// set.play(ta).with(ra); // // 在before(动画)执行之前执行play(动画) //// set.play(ta).before(ra); // // 在after(动画)之后执行play(动画) // set.play(ta).after(ra); // set.start(); // 加载xml文件中的属性动画 // Animator animator = AnimatorInflater.loadAnimator(this, R.animator.animator_translation); // animator.setTarget(imgShow); // animator.start(); break; case R.id.btn_after: Log.i(TAG, "结束后: " + imgShow.getTranslationX()); // end之后直接停止动画并且执行到最终的设置的状态 // animatorTranslation.end(); // cancel之后停止动画并且停留在当前的状态 animatorTranslation.cancel(); break; } } private void objectAnimator() { // 属性动画不仅仅可以作用在View上,还可以作用于普通的变量,只要这个变量的属性有setter方法就可以 Person p = new Person(); p.setName("zhangsan"); p.setAge(1); ObjectAnimator animator = ObjectAnimator.ofInt( p, "age", 1, 10 ); animator.setDuration(3000); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Object value = animation.getAnimatedValue(); Log.i(TAG, "onAnimationUpdate: " + value); } }); animator.start(); } private void rotationAnimator() { // imgShow.setRotation(); // ObjectAnimator animator = ObjectAnimator.ofFloat( // imgShow, // "rotation", // 0, // 180 // ); // ObjectAnimator animatorX = ObjectAnimator.ofFloat( // imgShow, // "rotationX", // 0, // 180 // ); // // animatorX.setDuration(3000); // animatorX.start(); ObjectAnimator animatorY = ObjectAnimator.ofFloat( imgShow, "rotationY", 0, 180 ); animatorY.setDuration(3000); animatorY.start(); } private void scaleAnimator() { // imgShow.setScaleX(); // imgShow.setScaleY(); ObjectAnimator animatorX = ObjectAnimator.ofFloat( imgShow, "scaleX", 1, 3 ); ObjectAnimator animatorY = ObjectAnimator.ofFloat( imgShow, "scaleY", 1, 3 ); animatorX.setDuration(3000); animatorY.setDuration(3000); animatorX.start(); animatorY.start(); } private void alphaAnimator() { // imgShow.setAlpha(); // 透明度的变化,0是完全透明,1是完全不透明 ObjectAnimator animator = ObjectAnimator.ofFloat(imgShow, "alpha", 0, 1); animator.setDuration(3000); animator.start(); } private void translateAnimator() { // 属性动画完成平移,真实的改变了控件的属性,发生真实的动画效果 ObjectAnimator txAnimator = ObjectAnimator.ofFloat( imgShow, "translationX", 0, 500 ); ObjectAnimator tyAnimator = ObjectAnimator.ofFloat( imgShow, "translationY", 0, 500 ); txAnimator.setDuration(3000); tyAnimator.setDuration(3000); txAnimator.start(); tyAnimator.start(); // 补间动画完成平移效果,并没有对控件的属性发生变化,只是视觉上的动画效果 // TranslateAnimation translateAnimation = new TranslateAnimation(0, 500, 0, 0); // translateAnimation.setDuration(3000); // imgShow.startAnimation(translateAnimation); // 补间动画只能作用的Vew上 // Person p = new Person(); }