小視頻系統源碼自定View-模仿點我達開頻頁加載動畫

package com.example.custome_view.diwoda;

import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

import com.example.custome_view.R;
import com.fudaojun.fudaojunlib.utils.LibCalcUtil;

/**
 * Created by ZhijunHong on 2018/7/5.
 * 一個簡單的自定義View + 動畫集合
 */

public class DiWoDaView extends View {
    //控件寬度
    private int mWidth;
    //控件高度
    private int mHeight;
    //外部圓畫筆
    private Paint mOutCirclePaint;
    //外部圓半徑
    private float mOutCircleRaduis;
    //外部圓透明度
    private int mTransparency;
    //外部圓顏色
    private int mCircleColor;

    //內部圓畫筆
    private Paint mInCirclePaint;
    //內部圓半徑
    private float mInCicleRadius;

    //handler
    private Handler mHandler;

    //動畫集合
    private AnimatorSet mAnimationSet;

    public DiWoDaView(Context context) {
        this(context, null);
    }

    public DiWoDaView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DiWoDaView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        init();
    }

    /**
     * 初始化資源
     */
    private void init() {
        mOutCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);
        mOutCirclePaint.setStyle(Paint.Style.FILL);
        mOutCirclePaint.setColor(Color.YELLOW);

        mInCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);
        mInCirclePaint.setStyle(Paint.Style.FILL);
        mInCirclePaint.setColor(getResources().getColor(R.color.orange));

        mOutCircleRaduis = LibCalcUtil.dp2px(getContext(), 80);
        mInCicleRadius = LibCalcUtil.dp2px(getContext(), 40);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidth = w;
        mHeight = h;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.translate(mWidth / 2, mHeight / 2);
        //畫外圍大圓
        canvas.drawCircle(0, 0, mOutCircleRaduis, mOutCirclePaint);
        //畫裏面小圓
        canvas.drawCircle(0, 0, mInCicleRadius, mInCirclePaint);
    }

    /**
     * 開始動畫
     */
    public void playAnimation() {
        if (mAnimationSet == null) {
            mAnimationSet = new AnimatorSet();

            //大圓半徑變更動畫
            ValueAnimator anim1 = ValueAnimator.ofFloat(0, mOutCircleRaduis);
            //大圓透明度變更動畫
            ValueAnimator anim2 = ValueAnimator.ofInt(256, 0);

//            //沿Y軸旋轉動畫
//            ObjectAnimator anim3 = ObjectAnimator.ofFloat(this, "rotationY", 0f, 360f);
//            //設置一起執行動畫
//            mAnimationSet.playTogether(anim1, anim2, anim3);
//            anim3.setRepeatCount(ValueAnimator.INFINITE);

            mAnimationSet.playTogether(anim1, anim2);

            //設置重複執行動畫
            anim1.setRepeatCount(ValueAnimator.INFINITE);
            anim2.setRepeatCount(ValueAnimator.INFINITE);

            anim1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    if (animation != null) {
                        //改變外圍大圓半徑
                        mOutCircleRaduis = (float) animation.getAnimatedValue();
                    }
                }
            });

            anim2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    //改變外圍大圓透明度
                    mTransparency = (int) animation.getAnimatedValue();
                }
            });
        }

        //啓動動畫
        mAnimationSet.setDuration(2000).start();

        if (mHandler == null) {
            mHandler = new Handler();
        }
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mCircleColor = Color.argb(mTransparency, 255, 143, 5);
                mOutCirclePaint.setColor(mCircleColor);

                //重繪
                postInvalidate();
                mHandler.postDelayed(this, 50);
            }
        }, 50);

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章