美文网首页动画
动画第一步->ValueAnimator 基本使用

动画第一步->ValueAnimator 基本使用

作者: crossroads | 来源:发表于2016-12-14 11:55 被阅读284次
    极客学院Animation教程讲解的很详细,点击进入哦

    这里为学习的整理和补充O(∩_∩)O

    一、 使用ValueAnimator

    1. 初始化ValueAnimator
    • 方式一
    //演示从(0,0)到(400,400)的移动
    view = findViewById(R.id.view);
    //可以传入n个Int类型的数值,这里仅传入两个0、400
    ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400);
    valueAnimator.setDuration(3000);
    //监听3000ms内,从0->400数值的实时变化
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int curValue = (int) animation.getAnimatedValue();
            //没有layout的调用,view是不会移动的,layout设置view的位置
            view.layout(curValue, curValue, curValue + view.getWidth(), curValue + view.getHeight());
        }});
    //开始动画
    valueAnimator.start();
    //也可以设置延长n毫秒之后启动
    //valueAnimator.setStartDelay(10000);
    
    • 方式二
    //和ofInt的功能一样,只是一个Int类型,一个Float类型
    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f,288.88f, 88.8f);
    valueAnimator.setDuration(3000);
    valueAnimator.setRepeatCount(1);
    valueAnimator.setRepeatMode(ValueAnimator.INFINITE);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            Float animatedValue = (Float) animation.getAnimatedValue();
            //获取整数部分的值
            int curValue = animatedValue.intValue();
            view.layout(curValue, curValue, curValue + view.getWidth(), curValue + view.getHeight());
        }});
    valueAnimator.start();
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
              //点击取消当前动画
              valueAnimator.cancel();
        }});
    

    注意:此时view的位置已经移动,点击此时的view是有反应的,这是和补间动画不同的,点击进入,后记中有标注

    2.添加Listener 监听

    valueAnimator.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) {  
         }  
     });  
    //执行结果 start->(repeat)->(cancel)->end
    

    3.取消监听

    //移除 AnimatorUpdateListener 
    void removeUpdateListener(AnimatorUpdateListener listener);  
    void removeAllUpdateListeners();  
    //移除 AnimatorListener 
    void removeListener(AnimatorListener listener);  
    void removeAllListeners();
    

    4.其他函数

    //完全克隆一个 ValueAnimator 实例,包括它所有的设置以及所有对监听器代码的处理 
    //和克隆差不多,两者除了外貌,并没有其他的关联哦~
    public ValueAnimator clone() 
    

    二、小试牛刀

    一起尝试一下下边的例子如何实现吧!


    引用自http://wiki.jikexueyuan.com/project/android-animation/6.html
    • 首先,可以看出这是一个在一定时间内变大的圆,并且最后回弹了,可以用BounceInterpolator

    • 那么,第一步,我们定义一个圆,在res/drawable下新建circle.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <shape    xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval">
        <size
            android:width="30dp"
            android:height="30dp"
            />
        <solid
            android:color="#ff0000"
            />
    </shape>
    

    就可以得到这样一个圆:


    红红滴圆.png
    • 在布局中引用一下
    <View
        android:gravity="center"
        android:id="@+id/view"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:background="@drawable/circle"
        />
    
    • 最后一步,java代码引用,yeah~
    view = findViewById(R.id.view);
    ValueAnimator valueAnimator = ValueAnimator.ofInt(20, 600);
    valueAnimator.setDuration(3000);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int curValue = (int) animation.getAnimatedValue();
            ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
            layoutParams.width = layoutParams.height = curValue;
            view.setLayoutParams(layoutParams);
        }});
    valueAnimator.setInterpolator(new BounceInterpolator());
    valueAnimator.start();
    }
    

    后记:
    Property Animator(属性动画) 包括 ValueAnimator 和 ObjectAnimation,Property Animator 是通过改变控件内部的属性值来达到动画效果的;
    View Animation(视图动画) 包括 Tween Animation(补间动画)和 Frame Animation(逐帧动画),补间动画虽能对控件做动画,但并没有改变控件内部的属性值;之前的TranslateAnimation就是补间动画
    专业术语,还是稍微记一下吧😁

    相关文章

      网友评论

        本文标题:动画第一步->ValueAnimator 基本使用

        本文链接:https://www.haomeiwen.com/subject/wlcbmttx.html