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);        }    });}

}

更多相关文章

  1. android ImageView的scaleType属性
  2. 修改Android的开关机铃声、Android开关机画面与动画(附代码流程)
  3. 关于Android 相对布局中的属性 的介绍和运用
  4. android之布局xml各种控件属性详解
  5. Android Wifi的一些属性
  6. android使用属性动画执行抖动效果
  7. android 一个好看的翻转动画实现
  8. android代码实现ScaleAnimation动画(附原码)
  9. 自定义View ----QQ5.0左边侧滑 + 动画

随机推荐

  1. Android开机启动过程分析
  2. 为什么Android API中有这么多花车?
  3. Android中Broadcast Receiver的两种注册
  4. android ontouch和onclick冲突处理
  5. android:使用网络通信技术从客户端直接获
  6. Libgdx设置UI在新GWT项目中出现2个意外错
  7. 简单分析Android中添加shortcut方面的源
  8. 在android中使用webrtc的噪声抑制模块
  9. 必须在调用加载前设置广告尺寸和广告单元
  10. Android 菜单动态变化【添加或去除】