美文网首页
Android启动页倒数读秒按钮

Android启动页倒数读秒按钮

作者: 风淋天下 | 来源:发表于2017-09-11 18:35 被阅读0次

    第一次在简书上写东西,还不太熟悉,希望能一直坚持写。
    刚刚模仿了一个启动页倒数读秒按钮。效果如下:

    CircleProgressView.class

    package com.test.circleprogressviewtest;
    
    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;
    
    /**
     * 启动页-倒数读秒跳转按钮
     */
    public class CircleProgressView extends View {
        private Paint pProgress;
        private Paint pText;
        private Paint pBorder;
        private Paint pCircle;
    
        private int progressColor;
        private int borderColor;
        private int circleColor;
    
        private float circleRadius;
        private float borderWidth;
        private float circleAndBorderRadius;
    
        private String text = "";
        private float textSize = 20.0F;
        private int textColor;
    
        private int halfWidth;
        private int halfHeight;
        private float topOffset = 60.0F;
    
        private int borderAlpha = 100;
        private int currentAlpha = 100;
    
        private ITimeout iTimeout;
    
        public CircleProgressView(Context paramContext, AttributeSet paramAttributeSet) {
            super(paramContext, paramAttributeSet);
            TypedArray typedArray = paramContext.getTheme().obtainStyledAttributes(paramAttributeSet, R.styleable.CircleProgressView, 0, 0);
            circleRadius = typedArray.getDimension(R.styleable.CircleProgressView_circleRadius, 80.0F);
    
            circleColor = typedArray.getColor(R.styleable.CircleProgressView_circleColor, 0);
            borderColor = typedArray.getColor(R.styleable.CircleProgressView_circleBorderColor, -1);
            progressColor = typedArray.getColor(R.styleable.CircleProgressView_circleProgressColor, -1);
    
            borderWidth = typedArray.getDimension(R.styleable.CircleProgressView_circleBorderWidth, 10.0F);
            borderAlpha = typedArray.getInteger(R.styleable.CircleProgressView_circleBorderAlpha, 100);
    
            text = typedArray.getString(R.styleable.CircleProgressView_circleText);
            textSize = typedArray.getDimension(R.styleable.CircleProgressView_circleTextSize, 0.0F);
            textColor = typedArray.getColor(R.styleable.CircleProgressView_circleTextColor, -1);
    
            circleAndBorderRadius = (circleRadius + borderWidth / 2.0F);
    
            pProgress = new Paint();
            pProgress.setAntiAlias(true);
            pProgress.setColor(progressColor);
            pProgress.setStyle(Paint.Style.FILL);
    
            pBorder = new Paint();
            pBorder.setAntiAlias(true);
            pBorder.setColor(borderColor);
            pBorder.setStyle(Paint.Style.STROKE);
            pBorder.setStrokeWidth(borderWidth);
    
            pCircle = new Paint();
            pCircle.setAntiAlias(true);
            pCircle.setColor(circleColor);
            pCircle.setStyle(Paint.Style.STROKE);
            pCircle.setStrokeWidth(borderWidth);
    
            pText = new Paint();
            pText.setAntiAlias(true);
            pText.setStyle(Paint.Style.FILL);
            pText.setColor(textColor);
            pText.setTextSize(textSize);
        }
    
        public int getCurrentAlpha() {
            return currentAlpha;
        }
    
        public void invalidate(int alpha) {
            currentAlpha = alpha;
            postInvalidate();
        }
    
        public void startProgress(long totalTime, ITimeout iTimeout) {
            this.iTimeout = iTimeout;
    
            new Thread(new CountDownRunnable(this, totalTime)).start();
        }
    
        protected void onDraw(Canvas paramCanvas) {
            halfWidth = (getWidth() / 2);
            halfHeight = (getHeight() / 2);
            paramCanvas.drawCircle(halfWidth, halfHeight, circleRadius, pProgress);
    
            if (currentAlpha >= 0) {
                RectF localRectF = new RectF();
                localRectF.left = (halfWidth - circleAndBorderRadius);
                localRectF.top = (halfHeight - circleAndBorderRadius);
                localRectF.right = (circleAndBorderRadius * 2.0F + (halfWidth - circleAndBorderRadius));
                localRectF.bottom = (circleAndBorderRadius * 2.0F + (halfHeight - circleAndBorderRadius));
                paramCanvas.drawArc(localRectF, -90.0F, -360.0F, false, pCircle);
                paramCanvas.drawArc(localRectF, -90.0F, 360.0F * (100 - currentAlpha) / borderAlpha, false, pBorder);
                float textWidth = pText.measureText(text, 0, text.length());
                paramCanvas.drawText(text, halfWidth - textWidth / 2.0F, halfHeight + topOffset / 4.0F, pText);
    
                if (currentAlpha == 0 && iTimeout != null) {
                    iTimeout.timeout();
                }
            }
        }
    
        public interface ITimeout {
            void timeout();
        }
    }
    
    

    CountDownRunnable.class

    package com.test.circleprogressviewtest;
    
    final class CountDownRunnable implements Runnable {
        private CircleProgressView circleProgressView;
        private long totalTime = 2000L;
    
        public CountDownRunnable(CircleProgressView circleProgressView, long paramLong) {
            this.circleProgressView = circleProgressView;
            this.totalTime = paramLong;
        }
    
        public final void run() {
            long sleepTime = this.totalTime / circleProgressView.getCurrentAlpha();
    
            circleProgressView.invalidate(100);
            while (circleProgressView.getCurrentAlpha() > 0) {
                circleProgressView.invalidate(circleProgressView.getCurrentAlpha() - 1);
                try {
                    Thread.sleep(1L * sleepTime);
                } catch (Exception localException) {
                    localException.printStackTrace();
                }
            }
        }
    }
    

    attrs.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="CircleProgressView">
            <attr name="circleRadius" format="dimension" />
            <attr name="circleColor" format="color" />
            <attr name="circleText" format="string" />
            <attr name="circleTextSize" format="dimension" />
            <attr name="circleTextColor" format="color" />
            <attr name="circleBorderWidth" format="dimension" />
            <attr name="circleBorderColor" format="color" />
            <attr name="circleBorderAlpha" format="integer" />
            <attr name="circleProgressColor" format="color" />
        </declare-styleable>
    </resources>
    

    activity_splash.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:progress="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="com.test.circleprogressviewtest.SplashActivity">
    
        <com.test.circleprogressviewtest.CircleProgressView
            android:id="@+id/jump_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="28dp"
            android:layout_marginRight="28dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            progress:circleRadius="20.0dp"
            progress:circleColor="#66000000"
            progress:circleText="跳转"
            progress:circleTextSize="14sp"
            progress:circleTextColor="#e6ffffff"
            progress:circleBorderWidth="2dp"
            progress:circleBorderColor="#ffe2e2e2"
            progress:circleBorderAlpha="100"
            progress:circleProgressColor="#fff39c11" />
    </android.support.constraint.ConstraintLayout>
    

    SplashActivity.class

    package com.test.circleprogressviewtest;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Toast;
    
    public class SplashActivity extends AppCompatActivity implements 
              View.OnClickListener, CircleProgressView.ITimeout {
        CircleProgressView circleProgressView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_splash);
    
            circleProgressView = (CircleProgressView) findViewById(R.id.jump_btn);
    
            circleProgressView.startProgress(2000, this);
    
            circleProgressView.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            Toast.makeText(SplashActivity.this, "点击了跳转", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void timeout() {
            Toast.makeText(SplashActivity.this, "跳转", Toast.LENGTH_SHORT).show();
        }
    }
    

    相关文章

      网友评论

          本文标题:Android启动页倒数读秒按钮

          本文链接:https://www.haomeiwen.com/subject/czvfsxtx.html