属性动画

来源:互联网 发布:真丝睡衣 知乎 编辑:程序博客网 时间:2024/05/29 07:04

//属性动画的平移,渐变,缩放,旋转import android.animation.Animator;import android.animation.ArgbEvaluator;import android.animation.ValueAnimator;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.view.animation.AccelerateDecelerateInterpolator;import android.view.animation.Animation;import android.view.animation.TranslateAnimation;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    /**     * 开启动画     */    private Button mBtStart;    /**     * Hello World!     */    private TextView mTv;    /**     * 停止     */    private Button mBtStop;    private ValueAnimator valueAnimator;    /**     * 取消监听     */    private Button mBtCancleListener;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        mBtStart = (Button) findViewById(R.id.bt_start);        mBtStart.setOnClickListener(this);        mTv = (TextView) findViewById(R.id.tv);        mTv.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(MainActivity.this, "mTv 点击了", Toast.LENGTH_SHORT).show();            }        });        mBtStop = (Button) findViewById(R.id.bt_stop);        mBtStop.setOnClickListener(this);        mBtCancleListener = (Button) findViewById(R.id.bt_cancle_listener);        mBtCancleListener.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.bt_start:                propAnim();//                trans();//                propColor();                break;            case R.id.bt_stop:                //停止动画                if (valueAnimator != null && valueAnimator.isRunning()) {//                    valueAnimator.cancel();                    valueAnimator.end();                }                break;            case R.id.bt_cancle_listener:                //取消监听                valueAnimator.removeListener(animatorListener);                break;        }    }    private void trans() {        TranslateAnimation translateAnimation = new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 300, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 400);        translateAnimation.setDuration(3000);        translateAnimation.setFillAfter(true);        mTv.startAnimation(translateAnimation);    }    private void propColor() {        ValueAnimator valueAnimator = ValueAnimator.ofInt(0xffff0000, 0xff0000ff);        valueAnimator.setEvaluator(new ArgbEvaluator());        valueAnimator.setDuration(3000);        valueAnimator.setRepeatCount(ValueAnimator.INFINITE);        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                int color = (int) animation.getAnimatedValue();                mTv.setBackgroundColor(color);            }        });        valueAnimator.start();    }    private void propAnim() {        //先创建一个ValueAnimator        valueAnimator = ValueAnimator.ofInt(0, 300);        //设置动画执行时间        valueAnimator.setDuration(3000);        //设置重复次数//        valueAnimator.setRepeatCount(ValueAnimator.INFINITE);        //设置动画重复模式        valueAnimator.setRepeatMode(ValueAnimator.REVERSE);        //设置插值器        valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());        //设置监听        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                int value = (int) animation.getAnimatedValue();//                Log.e("MainActivity", "value:" + value);                mTv.layout(value, value, value + mTv.getWidth(), value + mTv.getHeight());            }        });        valueAnimator.addListener(animatorListener);        //开启动画        valueAnimator.start();    }    private Animator.AnimatorListener animatorListener = new Animator.AnimatorListener() {        @Override        public void onAnimationStart(Animator animation) {            Log.e("MainActivity", "onAnimationStart");        }        @Override        public void onAnimationEnd(Animator animation) {            Log.e("MainActivity", "onAnimationEnd");        }        @Override        public void onAnimationCancel(Animator animation) {            Log.e("MainActivity", "onAnimationCancel");        }        @Override        public void onAnimationRepeat(Animator animation) {            Log.e("MainActivity", "onAnimationRepeat");        }    };}//点击按钮,图片从四个方向出来import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.ImageView;public class Main3Activity extends AppCompatActivity implements View.OnClickListener {    private ImageView mIvTop;    private ImageView mIvRight;    private ImageView mIvBottom;    private ImageView mIvLeft;    private ImageView mIvCircle;    private boolean flag;//false表示未显示,true表示已经显示了    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main3);        initView();    }    private void initView() {        mIvTop = (ImageView) findViewById(R.id.iv_top);        mIvRight = (ImageView) findViewById(R.id.iv_right);        mIvBottom = (ImageView) findViewById(R.id.iv_bottom);        mIvLeft = (ImageView) findViewById(R.id.iv_left);        mIvCircle = (ImageView) findViewById(R.id.iv_circle);        mIvCircle.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.iv_circle:                if (!flag) {                    //点击把所有图标都展示出来                    show();                } else {                    //点击把所有图标都收起来                    dismiss();                }                flag = !flag;                break;        }    }    /**     * 展示图标     */    private void show() {        ObjectAnimator tranLeft = ObjectAnimator.ofFloat(mIvLeft, "TranslationX", 0f, -100f);        ObjectAnimator tranRight = ObjectAnimator.ofFloat(mIvRight, "TranslationX", 0f, 100f);        ObjectAnimator tranTop = ObjectAnimator.ofFloat(mIvTop, "TranslationY", 0f, -100f);        ObjectAnimator tranBottom = ObjectAnimator.ofFloat(mIvBottom, "TranslationY", 0f, 100f);        AnimatorSet animatorSet = new AnimatorSet();        animatorSet.playTogether(tranBottom, tranLeft, tranRight, tranTop);        animatorSet.setDuration(2000);        animatorSet.start();    }    private void dismiss() {        ObjectAnimator tranLeft = ObjectAnimator.ofFloat(mIvLeft, "TranslationX", -100f, 0f);        ObjectAnimator tranRight = ObjectAnimator.ofFloat(mIvRight, "TranslationX", 100f, 0f);        ObjectAnimator tranTop = ObjectAnimator.ofFloat(mIvTop, "TranslationY", -100f, 0f);        ObjectAnimator tranBottom = ObjectAnimator.ofFloat(mIvBottom, "TranslationY", 100f, 0f);        AnimatorSet animatorSet = new AnimatorSet();        animatorSet.playTogether(tranBottom, tranLeft, tranRight, tranTop);        animatorSet.setDuration(2000);        animatorSet.start();    }}//贝塞尔曲线动画,模拟点赞import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.animation.TypeEvaluator;import android.animation.ValueAnimator;import android.content.Context;import android.graphics.PointF;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.animation.AccelerateDecelerateInterpolator;import android.view.animation.AccelerateInterpolator;import android.view.animation.DecelerateInterpolator;import android.view.animation.Interpolator;import android.view.animation.LinearInterpolator;import android.widget.ImageView;import android.widget.RelativeLayout;import java.util.Random;public class LoveLayout extends RelativeLayout {    private Drawable mRed, mYellow, mBlue;    private Drawable[] mDrawables;    private Interpolator[] mInterpolators;    private int mDrawableHeight, mDrawableWidth;    private int mWidth, mHeight;    private LayoutParams params;    private Random mRandom = new Random();    public LoveLayout(Context context) {        this(context, null);    }    public LoveLayout(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public LoveLayout(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    private void init() {        initDrawable();        initInterpolator();        // 初始化params        params = new LayoutParams(mDrawableWidth, mDrawableHeight);        // 父容器水平居中        params.addRule(CENTER_HORIZONTAL, TRUE);        // 父容器的底部        params.addRule(ALIGN_PARENT_BOTTOM, TRUE);    }    /**     * 初始化几种插补器     */    private void initInterpolator() {        mInterpolators = new Interpolator[4];        mInterpolators[0] = new LinearInterpolator();// 线性        mInterpolators[1] = new AccelerateDecelerateInterpolator();// 先加速后减速        mInterpolators[2] = new AccelerateInterpolator();// 加速        mInterpolators[3] = new DecelerateInterpolator();// 减速    }    private void initDrawable() {//        mRed = getResources().getDrawable(R.drawable.pl_red);//        mYellow = getResources().getDrawable(R.drawable.pl_yellow);//        mBlue = getResources().getDrawable(R.drawable.pl_blue);        mDrawables = new Drawable[3];        mDrawables[0] = mRed;        mDrawables[1] = mYellow;        mDrawables[2] = mBlue;        // 得到图片的实际宽高        mDrawableWidth = mRed.getIntrinsicWidth();        mDrawableHeight = mRed.getIntrinsicHeight();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        mWidth = getMeasuredWidth();        mHeight = getMeasuredHeight();    }    /**     * 添加点赞图片     **/    public void addLove() {        final ImageView loveIv = new ImageView(getContext());        loveIv.setImageDrawable(mDrawables[mRandom.nextInt(mDrawables.length)]);        loveIv.setLayoutParams(params);        addView(loveIv);        // 最终的属性动画集合        AnimatorSet finalSet = getAnimatorSet(loveIv);        finalSet.start();    }    /**     * 构造三个属性动画     */    private AnimatorSet getAnimatorSet(ImageView loveIv) {        // 1.alpha动画        ObjectAnimator alpha = ObjectAnimator                .ofFloat(loveIv, "alpha", 0.3f, 1f);        // 2.缩放动画        ObjectAnimator scaleX = ObjectAnimator.ofFloat(loveIv, "scaleX", 0.2f, 1f);        ObjectAnimator scaleY = ObjectAnimator.ofFloat(loveIv, "scaleY", 0.2f, 1f);        // 刚刚进入动画集合        AnimatorSet enter = new AnimatorSet();        enter.setDuration(500);        enter.playTogether(alpha, scaleX, scaleY);        enter.setTarget(loveIv);        return enter;    }    /**     * 贝塞尔曲线动画(核心,不断的修改ImageView的坐标ponintF(x,y) )     */    private ValueAnimator getBezierValueAnimator(final ImageView loveIv) {        // 曲线的两个顶点//        PointF pointF2 = getPonitF(2);//        PointF pointF1 = getPonitF(1);        // 起点位置        PointF pointF0 = new PointF((mWidth - mDrawableWidth) / 2, mHeight                - mDrawableHeight);        // 结束的位置        PointF pointF3 = new PointF(mRandom.nextInt(mWidth), 0);        // 估值器Evaluator,来控制view的行驶路径(不断的修改point.x,point.y)//        BezierEvaluator evaluator = new BezierEvaluator(pointF1, pointF2);        // 属性动画不仅仅改变View的属性,还可以改变自定义的属性//        ValueAnimator animator = ValueAnimator.ofObject(evaluator, pointF0,//                pointF3);        ValueAnimator animator = null;        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                // 不断改变ImageView的x,y的值                PointF pointF = (PointF) animation.getAnimatedValue();                loveIv.setX(pointF.x);                loveIv.setY(pointF.y);                loveIv.setAlpha(1 - animation.getAnimatedFraction() + 0.1f);// 得到百分比            }        });        animator.setTarget(loveIv);        animator.setDuration(3000);        return animator;    }    // 贝塞尔估值器    public class BezierEvaluator implements TypeEvaluator<PointF> {        private PointF point1, point2;        public BezierEvaluator(PointF pointF1, PointF pointF2) {            this.point1 = pointF1;            this.point2 = pointF2;        }        @Override        public PointF evaluate(float t, PointF point0, PointF point3) {            // t百分比, 0~1            PointF point = new PointF();            point.x = point0.x * (1 - t) * (1 - t) * (1 - t) //                    + 3 * point1.x * t * (1 - t) * (1 - t)//                    + 3 * point2.x * t * t * (1 - t)//                    + point3.x * t * t * t;//            point.y = point0.y * (1 - t) * (1 - t) * (1 - t) //                    + 3 * point1.y * t * (1 - t) * (1 - t)//                    + 3 * point2.y * t * t * (1 - t)//                    + point3.y * t * t * t;//            // 套用上面的公式把点返回            return point;        }    }}


原创粉丝点击