android 属性动画的一些经验

本文展示了如何使用自定义的ValueAnimator类来创建动态的圆形绘制效果,并通过改变背景颜色、圆心位置等属性实现动画效果。具体包括动画路径、速度控制以及无限循环播放等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有时间将工作用到的一些东西整理了出来,给大家共享下,也给自己备份一份记忆!大笑

public class ValueAnimatorTestView extends View {

    private static final int RADIUS = 50;
    private Paint mPaint;
    private Point point;

    public ValueAnimatorTestView(Context context) {
        super(context);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(Color.CYAN);
        ValueAnimator backGroundColorAutoChangeAnimator = ObjectAnimator.ofInt(this,
                "backgroundColor", Color.RED, 0xff8080FF);
        backGroundColorAutoChangeAnimator.setDuration(3000);
        backGroundColorAutoChangeAnimator.setEvaluator(new ArgbEvaluator());
        backGroundColorAutoChangeAnimator.setRepeatCount(ValueAnimator.INFINITE);// 设置重复模式,现在是无限重复
        backGroundColorAutoChangeAnimator.setRepeatMode(ValueAnimator.REVERSE);// 设置重复的方向
                                                                               // 现在是反向
        backGroundColorAutoChangeAnimator.start();
    }

    public ValueAnimatorTestView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(Color.CYAN);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (point == null) {
            point = new Point(RADIUS, RADIUS);
            drawCircle(canvas);
            startAnimale();
        } else {
            drawCircle(canvas);
        }
    }

    @SuppressLint("NewApi")
    private void startAnimale() {
        Point startPoint = new Point(RADIUS, RADIUS);
        Point endPoint = new Point(getWidth() - RADIUS, getHeight() - RADIUS);
        ValueAnimator animator = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);
        animator.addUpdateListener(new AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                point = (Point) animation.getAnimatedValue();
                invalidate();
            }
        });
        animator.setInterpolator(new AccelerateDecelerateInterpolator());// 加速
        Point upStartPoint = new Point(getWidth() - RADIUS, getHeight() - RADIUS);
        Point upEndPoint = new Point(getWidth() - RADIUS, RADIUS);
        ValueAnimator backAnimator = ValueAnimator.ofObject(new PointEvaluator(), upStartPoint,
                upEndPoint);
        backAnimator.addUpdateListener(new AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                point = (Point) animation.getAnimatedValue();
                invalidate();
            }
        });
        backAnimator.setInterpolator(new DecelerateInterpolator());// 减速
        AnimatorSet s1 = new AnimatorSet();
        s1.playSequentially(animator, backAnimator);// 串行
        // animator.setDuration(10000);
        // animator.start();
        // 第一个参数是设置动画的对象
        // 第二个参数是设置动画的属性
        // 第三四参数是属性的变化区域,可以有多个,那就是两边的是起始点,中间的是过度点
        ValueAnimator backGroundColorAutoChangeAnimator = ObjectAnimator.ofInt(mPaint, "color",
                Color.WHITE, Color.BLACK);
        // backGroundColorAutoChangeAnimator.setDuration(10000);
        backGroundColorAutoChangeAnimator.setEvaluator(new ArgbEvaluator());
        backGroundColorAutoChangeAnimator.setRepeatCount(ValueAnimator.INFINITE);
        backGroundColorAutoChangeAnimator.setRepeatMode(ValueAnimator.REVERSE);
        // backGroundColorAutoChangeAnimator.start();
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(s1, backGroundColorAutoChangeAnimator);// 并行
        animatorSet.setDuration(5000);
        // animatorSet.play(animator).with(backGroundColorAutoChangeAnimator);
        animatorSet.start();
    }

    private void drawCircle(Canvas canvas) {
        int x = point.x;
        int y = point.y;
        canvas.drawCircle(x, y, RADIUS, mPaint);
    }

下面是一些效果图,制作动态挺麻烦的,家就这看吧 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值