animation of android (3)

本文介绍如何使用 ValueAnimator 在 Android 中实现属性动画。通过自定义 View 并利用 ValueAnimator 对象属性的变化,可以制作出流畅的动画效果。文章详细展示了如何设置动画更新监听器并在每次动画更新时调用 onDraw 方法重新绘制视图。

视图动画,只有view可以使用。

在android3.0以后,属性动画。

ValueAnimation 可以记录属性变化的过程,所以他的对象是任何object。

所以ValueAnimation 的真正目的就是对object的某个值做一系列根据setInterpolator的值变化函数。

而ValueAnimation 有AnimatorUpdateListener的回调,以每个10ms的间隔,反馈随着时间的变化值。

具体代码如下:

package com.joyfulmath.animatatorsamples;

import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.animation.BounceInterpolator;

public class ValueAnimationView extends View {

    private static final String TAG = "ValueAnimationView";
    private Context mContext = null;
    private Paint mPaint = null;
    private float mX = 0;
    float topY = 0;  
    private ValueAnimator mValueAnimator = null;
    public ValueAnimationView(Context context) {
        this(context, null);
    }

    public ValueAnimationView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ValueAnimationView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        Log.d(TAG, "ValueAnimationView");
        mContext = context;
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.d(TAG, "onDraw:mX\t"+mX);
        canvas.drawColor(0xffffff00);
        canvas.save();
        canvas.translate(0, 0);
        canvas.drawText(TAG, mX, mX-topY, mPaint);
        canvas.restore();
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        Log.d(TAG, "onAttachedToWindow");
        mPaint = new Paint();
        mPaint.setTextSize(18);
        mPaint.setTextAlign(Align.LEFT);
        mPaint.setColor(0xffff0000);
        mPaint.setAntiAlias(true);
        FontMetrics fontMetrics = mPaint.getFontMetrics();
        topY = fontMetrics.top;  
        float ascentY = fontMetrics.ascent;  
        float descentY = fontMetrics.descent;  
        float bottomY = fontMetrics.bottom; 
        Log.d(TAG, "onAttachedToWindow fontMetrics  topY:" + topY
                + "\t ascentY:" + ascentY + "\t descentY:" + descentY
                + "\t bottomY:" + bottomY);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
    }
    
    public void createAnimator()
    {
        if(mValueAnimator == null)
        {
            mValueAnimator = ValueAnimator.ofFloat(0.0f, 50.0f);
            mValueAnimator.setDuration(1000);
            mValueAnimator.setInterpolator(new BounceInterpolator());
            mValueAnimator.addUpdateListener(new AnimatorUpdateListener() {
                
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    mX = (Float) animation.getAnimatedValue();
                    invalidate();
                }
            });
        }

    }
    
    public void startValueAmimator()
    {
        Log.d(TAG, "startValueAmimator");
        createAnimator();
        mValueAnimator.start();
    }
}

上面的代码,是自定义view,实现动画的一个基础。

关键就是每次OnDraw的时候,获取objcet动画的属性。

而触发条件就是:

            mValueAnimator.addUpdateListener(new AnimatorUpdateListener() {
                
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    mX = (Float) animation.getAnimatedValue();
                    invalidate();//触发onDraw
                }
            });
        }

所以valueObjcet的关键就是会在动画过程中改变object的属性,以此来决定如何通过这个变化来实现动画。

 

转载于:https://www.cnblogs.com/deman/p/4395842.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值