美文网首页
学习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