美文网首页
学习ValueAnimator高级使用2记录

学习ValueAnimator高级使用2记录

作者: 关玮琳linSir | 来源:发表于2018-04-13 13:23 被阅读15次

    学习ValueAnimator高级使用2记录

    ofObject()概述

    由于ofInt()和ofFloat()只能传入int,float两种类型,这个是肯定不能满足我们的需求的,所以我们又引入了ofObject()这个函数,这个函数就可以传入各种类型了:

    public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values);
    

    他具有两个参数,第一个参数是自定义的Evaluator,第二个是可变长参数,Object类型的。

    这里我们是强制传入Evaluator的,因为Evaluator的作用是根据当前动画的显示进度,计算出对应的值,因为Object是我们自定义的,所以这个值的转换的过程也必须是由我们指定的,不然系统也不知道怎么转换。

    示例代码:

    ValueAnimator animator = ValueAnimator.ofObject(new CharEvaluator(),new Character('A'),new Character('Z'));  
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
        @Override  
        public void onAnimationUpdate(ValueAnimator animation) {  
            char text = (char)animation.getAnimatedValue();  
            tv.setText(String.valueOf(text));  
        }  
    });  
    animator.setDuration(10000);  
    animator.setInterpolator(new AccelerateInterpolator());  
    animator.start();  
    
    public class CharEvaluator implements TypeEvaluator<Character> {  
        @Override  
        public Character evaluate(float fraction, Character startValue, Character endValue) {  
            int startInt  = (int)startValue;  
            int endInt = (int)endValue;  
            int curInt = (int)(startInt + fraction *(endInt - startInt));  
            char result = (char)curInt;  
            return result;  
        }  
    }  
    

    这里我们传入的两个参数是Character对象,一个是字母A,另一个是字母Z。
    animator.setInterpolator(new AccelerateInterpolator());我们使用的插值器是加速插值器,它会负责加速。

    我们自己实现的CharEvaluator,我们利用了ASCII的原理,在这里做了这样一个变化的效果。

    ofObject之自定义对象示例

    效果图:

    image

    上代码:

    Point.java

    public class Point {
    
        private int radius;
    
        public Point(int radius) {
            this.radius = radius;
        }
    
        public int getRadius() {
            return radius;
        }
    
        public void setRadius(int radius) {
            this.radius = radius;
        }
    }
    

    MyPointView.java

    public class MyPointView extends View {
    
        private Point mCurPoint;
    
        public MyPointView(Context context, AttributeSet attrs) {
            super(context, attrs);
            mCurPoint = new Point(300);
        }
    
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            if (mCurPoint != null) {
                Paint paint = new Paint();
                paint.setAntiAlias(true);
                paint.setColor(Color.RED);
                paint.setStyle(Paint.Style.FILL);
                canvas.drawCircle(300, 300, mCurPoint.getRadius(), paint);
            }
        }
    
        public void doPointAnim() {
            ValueAnimator animator = ValueAnimator.ofObject(new PointEvaluator(), new Point(20), new Point(200));
            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    mCurPoint = (Point) animation.getAnimatedValue();
                    invalidate();
                }
            });
            animator.setDuration(1000);
            animator.setInterpolator(new BounceInterpolator());
            animator.start();
        }
    
        class PointEvaluator implements TypeEvaluator<Point> {
            @Override
            public Point evaluate(float v, Point point, Point t1) {
                int start = point.getRadius();
                int end = t1.getRadius();
                int curValue = (int) (start + v * (end - start));
                return new Point(curValue);
            }
        }
    
    }
    
    

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        private MyPointView myPointView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            myPointView = (MyPointView) findViewById(R.id.my_point_view);
    
            myPointView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    myPointView.doPointAnim();
                }
            });
        }
    }
    

    这里面核心的代码在于doPointAnim这个方法和PointEvaluator这个类

    相关文章

      网友评论

          本文标题:学习ValueAnimator高级使用2记录

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