代码改变世界

圆环倒计时

2017-10-22 18:39  wang_chunqi  阅读(267)  评论(0)    收藏  举报

import android.content.Context;

 

/**

 * Created by gjy on 16/7/5.

 */

 

public class DisplayUtils {

    public static int px2dip(Context context, float pxValue) {

        final float scale = context.getResources().getDisplayMetrics().density;

        return (int) (pxValue / scale + 0.5f);

    }

 

    public static int dip2px(Context context, float dipValue) {

        final float scale = context.getResources().getDisplayMetrics().density;

        return (int) (dipValue * scale + 0.5f);

    }

 

    public static int px2sp(Context context, float pxValue) {

        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;

        return (int) (pxValue / fontScale + 0.5f);

    }

 

    public static int sp2px(Context context, float spValue) {

        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;

        return (int) (spValue * fontScale + 0.5f);

    }

}

 

//自定义view 设置圆环倒计时

import android.animation.Animator;

import android.animation.AnimatorListenerAdapter;

import android.animation.ValueAnimator;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.RectF;

import android.util.AttributeSet;

import android.view.View;

import android.view.animation.LinearInterpolator;

 

/**

 * Created by WORK on 2016/9/3.

 */

 

public class CountDownView extends View {

    //圆轮颜色

    private int mRingColor;

    //圆轮宽度

    private float mRingWidth;

    //圆轮进度值文本大小

    private int mRingProgessTextSize;

    //宽度

    private int mWidth;

    //高度

    private int mHeight;

    private Paint mPaint;

    //圆环的矩形区域

    private RectF mRectF;

    //

    private int mProgessTextColor;

    private int mCountdownTime;

    private float mCurrentProgress;

    private OnCountDownFinishListener mListener;

 

    public CountDownView(Context context) {

        this(context, null);

    }

 

    public CountDownView(Context context, AttributeSet attrs) {

        this(context, attrs, 0);

    }

 

    public CountDownView(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CountDownView);

        mRingColor = a.getColor(R.styleable.CountDownView_ringColor, context.getResources().getColor(R.color.colorAccent));

        mRingWidth = a.getFloat(R.styleable.CountDownView_ringWidth, 40);

        mRingProgessTextSize = a.getDimensionPixelSize(R.styleable.CountDownView_progressTextSize, DisplayUtils.sp2px(context, 20));

        mProgessTextColor = a.getColor(R.styleable.CountDownView_progressTextColor, context.getResources().getColor(R.color.colorAccent));

        mCountdownTime = a.getInteger(R.styleable.CountDownView_countdownTime, 60);

        //注意:记得回收

        a.recycle();

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

        mPaint.setAntiAlias(true);

        this.setWillNotDraw(false);

    }

 

    public void setCountdownTime(int mCountdownTime) {

        this.mCountdownTime = mCountdownTime;

    }

 

    @Override

    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

        super.onLayout(changed, left, top, right, bottom);

        mWidth = getMeasuredWidth();

        mHeight = getMeasuredHeight();

        mRectF = new RectF(0 + mRingWidth / 2, 0 + mRingWidth / 2,

                mWidth - mRingWidth / 2, mHeight - mRingWidth / 2);

    }

 

    @Override

    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);

        /**

         *圆环

         */

        //颜色

        mPaint.setColor(mRingColor);

        //空心

        mPaint.setStyle(Paint.Style.STROKE);

        //宽度

        mPaint.setStrokeWidth(mRingWidth);

        canvas.drawArc(mRectF, -90, mCurrentProgress - 360, false, mPaint);

        //绘制文本

        Paint textPaint = new Paint();

        textPaint.setAntiAlias(true);

        textPaint.setTextAlign(Paint.Align.CENTER);

//        String text = (int) (mCountdownTime - (mCountdownTime / 60f * mCurrentProgress / 6f)) + "";

        String text = mCountdownTime - (int) (mCurrentProgress / 360f * mCountdownTime) + "";

        textPaint.setTextSize(mRingProgessTextSize);

        textPaint.setColor(mProgessTextColor);

 

        //文字居中显示

        Paint.FontMetricsInt fontMetrics = textPaint.getFontMetricsInt();

        int baseline = (int) ((mRectF.bottom + mRectF.top - fontMetrics.bottom - fontMetrics.top) / 2);

        canvas.drawText(text, mRectF.centerX(), baseline, textPaint);

    }

 

    private ValueAnimator getValA(long countdownTime) {

        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100);

        valueAnimator.setDuration(countdownTime);

        valueAnimator.setInterpolator(new LinearInterpolator());

        valueAnimator.setRepeatCount(0);

        return valueAnimator;

    }

    /**

     * 开始倒计时

     */

    public void startCountDown() {

        setClickable(false);

        ValueAnimator valueAnimator = getValA(mCountdownTime * 1000);

        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override

            public void onAnimationUpdate(ValueAnimator animation) {

                float i = Float.valueOf(String.valueOf(animation.getAnimatedValue()));

                mCurrentProgress = (int) (360 * (i / 100f));

                invalidate();

            }

        });

        valueAnimator.start();

        valueAnimator.addListener(new AnimatorListenerAdapter() {

            @Override

            public void onAnimationEnd(Animator animation) {

                super.onAnimationEnd(animation);

                //倒计时结束回调

                if (mListener != null) {

                    mListener.countDownFinished();

                }

                setClickable(true);

            }

 

        });

    }

    public void setAddCountDownListener(OnCountDownFinishListener mListener) {

        this.mListener = mListener;

    }

    public interface OnCountDownFinishListener {

        void countDownFinished();

    }

 

 

}