属性动画

//属性动画的平移,渐变,缩放,旋转
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;
        }


    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值