android 圆环倒计时控件_第1张图片

1.自定义属性

<?xml version="1.0" encoding="utf-8"?>        name="CountDownView">                name="ringColor" format="color" />                name="progressTextSize" format="dimension" />                name="ringWidth" format="float" />                name="progressTextColor" format="color"/>                name="countdownTime" format="integer"/>    

2.自定义view

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;    ValueAnimator valueAnimator;    /**     * 监听事件     */    private OnCountDownListener mListener;    public CountDownView(Context context) {        this(context, null);    }    public CountDownView(Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public CountDownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);       // init();        /**         * 获取相关属性值         */        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CountDownView);        mRingColor = typedArray.getColor(R.styleable.CountDownView_ringColor, context.getResources().getColor(R.color.colorAccent));        mRingWidth = typedArray.getFloat(R.styleable.CountDownView_ringWidth, 40);        mRingProgessTextSize = typedArray.getDimensionPixelSize(R.styleable.CountDownView_progressTextSize, 20);        mProgessTextColor = typedArray.getColor(R.styleable.CountDownView_progressTextColor, context.getResources().getColor(R.color.colorAccent));        mCountdownTime = typedArray.getInteger(R.styleable.CountDownView_countdownTime, 60);        typedArray.recycle();        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mPaint.setAntiAlias(true);        this.setWillNotDraw(false);    }    @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);    }    /**     * 设置倒计时间 单位秒     * @param mCountdownTime     */    public void setCountdownTime(int mCountdownTime) {        this.mCountdownTime = mCountdownTime;        invalidate();    }//    public CountDownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {//        super(context, attrs, defStyleAttr, defStyleRes);//    }    /**     * 动画     * @param countdownTime     * @return     */    private ValueAnimator getValueAnimator(long countdownTime) {        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100);        valueAnimator.setDuration(countdownTime);        valueAnimator.setInterpolator(new LinearInterpolator());        valueAnimator.setRepeatCount(0);        return valueAnimator;    }    @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 = 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);    }    /**     * 开始倒计时     */    public void startCountDown() {        valueAnimator = getValueAnimator(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();                }            }        });    }    /**     * 停止倒计时     */    public void stopCountDdwn(){        valueAnimator.cancel();    }    public void setOnCountDownListener(OnCountDownListener mListener) {        this.mListener = mListener;    }}

3.布局文件

<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity">            android:id="@+id/countDownView"        android:layout_width="50dp"        android:layout_height="50dp"        app:countdownTime="5"        app:ringWidth="2"        app:layout_constraintBottom_toBottomOf="parent"        app:layout_constraintLeft_toLeftOf="parent"        app:layout_constraintRight_toRightOf="parent"        app:layout_constraintTop_toTopOf="parent" />

4.Activity

public class MainActivity extends AppCompatActivity {    CountDownView countDownView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);         countDownView = findViewById(R.id.countDownView);        countDownView.setOnCountDownListener(new OnCountDownListener() {            @Override            public void countDownFinished() {                //倒计时结束                //countDownView.setCountdownTime(10);                Intent intent = new Intent(MainActivity.this, Main2Activity.class);                startActivity(intent);            }        });        countDownView.startCountDown();        countDownView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                countDownView.stopCountDdwn();                Intent intent = new Intent(MainActivity.this, Main2Activity.class);                startActivity(intent);            }        });    }}


更多相关文章

  1. Android 四种获取屏幕宽度的方法总结
  2. Android之利用TextWatcher制作自定义编辑文本框
  3. Android读取SD卡.TXT文本内容
  4. 安卓 文本 滑动 android text slide
  5. Android获取屏幕高度及宽度
  6. Android中如何获取屏幕宽度和高
  7. android 如何让文本中某个关键字高亮显示?
  8. 关于android的imagebutton,imageview等无文本控件警告的解决办法

随机推荐

  1. 为什么 MongoDB 索引选择B-树,而 Mysql 索
  2. Android实现取消GridView中Item选中时默
  3. 分享Android平板电脑上开发应用程序不能
  4. Eclipse中将一个android项目当做另外一个
  5. 导入Eclipse工程到Android(安卓)studio
  6. Springboot中的javaConfig详解(基于Spring
  7. Android(安卓)平滑和立体翻页效果1
  8. Android(安卓)Canvas绘图抗锯齿解决方法
  9. Android(安卓)ListView的常见用法
  10. [原]Android(安卓)插件 根据布局xml自动