短信倒计时-- 使用小工具

原创
2017/11/30 14:15
阅读数 64

废话不多说直接上代码:

      /**
         * des:短信倒计时
         * @author ChenQ
         * @date 2017-11-30
         */
        public class CountButton extends AppCompatButton {
        
            public interface OnCountDownFinishListener {
                /**
                 * 计时结束回调
                 */
                void onFinished();
            }
        
            private static final String TAG = "CountButton";
        
            private boolean mRunning = false;
            private boolean mStarted = false;
        
            private long mSecondInFuture = 3;
            private String mDefaultText;
            private String mFormatString;
        
            private CountDownTimer mCountDownTimer;
            private OnCountDownFinishListener mOnCountDownFinishListener;
        
            public CountButton(Context context) {
                this(context, null);
            }
        
            public CountButton(Context context, AttributeSet attrs) {
                this(context, attrs, 0);
            }
        
            public CountButton(Context context, AttributeSet attrs, int defStyleAttr) {
                super(context, attrs, defStyleAttr);
                final TypedArray a = context.obtainStyledAttributes(
                        attrs, R.styleable.CountButton, defStyleAttr, 0);
                mSecondInFuture = a.getInt(R.styleable.CountButton_secondInFuture, (int) mSecondInFuture);
                mFormatString = a.getString(R.styleable.CountButton_format);
                a.recycle();
            }
        
            public void start() {
                mStarted = true;
                updateRunning();
                Log.e(TAG, "start");
            }
        
            public void stop() {
                mStarted = false;
                updateRunning();
                Log.e(TAG, "stop");
            }
        
            private void updateRunning() {
                boolean running = mStarted;
                if (running != mRunning) {
                    if (running) {
                        if (mCountDownTimer != null) {
                            mCountDownTimer.cancel();
                        }
                        setEnabled(false);
                        mDefaultText = getText().toString();
                        mCountDownTimer = new CountDownTimer(mSecondInFuture * 1000, 1000) {
                            @Override
                            public void onTick(long millisUntilFinished) {
                                setText(String.format(mFormatString, millisUntilFinished / 1000));
                                Log.e(TAG, String.format(mFormatString, millisUntilFinished / 1000));
                            }
        
                            @Override
                            public void onFinish() {
                                //倒计时结束
                                mRunning = false;
                                setEnabled(true);
                                setText(mDefaultText);
                                if (mOnCountDownFinishListener != null) {
                                    mOnCountDownFinishListener.onFinished();
                                }
                            }
                        }.start();
                    } else {
        //                removeCallbacks(mTickRunnable);
                        setEnabled(true);
                        setText(mDefaultText);
                        if (mCountDownTimer != null) {
                            mCountDownTimer.cancel();
                        }
                    }
                    mRunning = running;
                }
            }
        
        
            @Override
            protected void onDetachedFromWindow() {
                super.onDetachedFromWindow();
                stop();
            }
        
        
            public long getSecondInFuture() {
                return mSecondInFuture;
            }
        
            public void setSecondInFuture(long secondInFuture) {
                this.mSecondInFuture = secondInFuture;
            }
        
        
            public String getFormatString() {
                return mFormatString;
            }
        
            public void setFormatString(String formatString) {
                this.mFormatString = formatString;
            }
        
            public OnCountDownFinishListener getOnCountDownFinishListener() {
                return mOnCountDownFinishListener;
            }
        
            public void setOnCountDownFinishListener(OnCountDownFinishListener listener) {
                this.mOnCountDownFinishListener = listener;
            }
        }

增加 attr.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CountButton">
        <attr name="format" format="string"/>
        <attr name="secondInFuture" format="integer"/>
    </declare-styleable>
</resources>

使用方法很简单:

  • 1 代码实现(java ):
       CountButton textView = new CountButton(this);
       textView.setText("发送短信");
       textView.setFormatString("%s秒");
       textView.setSecondInFuture(3);
       textView.setBackgroundResource(R.color.colorAccent);
       textView.setTextColor(Color.WHITE);
       textView.setPadding(20,15,20,15);
       textView.setOnCountDownFinishListener(() -> {
           textView.stop();
           startActivity(new Intent(getApplicationContext(),LiveHikActivity.class));
       });
       textView.setOnClickListener(v -> textView.start());
       FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
       layoutParams.gravity = Gravity.CENTER;
       pageContainer.addView(textView,layoutParams);
  • 2 XMl 实现
            <com.colorchen.lib.video.view.CountDownButton
            android:id="@+id/countTv"
            android:layout_width="96dp"
            android:layout_height="48dp"
            android:background="@color/colorAccent"
            android:gravity="center"
            android:layout_gravity="center"
            android:text="发送短信"
            android:textColor="@android:color/white"
            android:textSize="16sp"
            app:format="%s秒"
            app:secondInFuture="3" />
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部