Android custom timebutton implementation countdown button

The project needs to implement a button with countdown function. Its effect is similar to the function of displaying countdown on the button after sending verification code and setting the button as unavailable.

In order to call other parts of the project, a timebutton inherited from the button is rewritten to realize the countdown function and facilitate the call.

Old rules, effect drawing:

The logic is not complex, and the code is directly:

First, create an app.class to inherit from the application

package com.example.xuboyu.myapplication;

/**
 * 用于存放倒计时时间
 * @author bnuzlbs-xuboyu 2017/4/5.
 */
import java.util.Map;

import android.app.Application;

public class App extends Application {
 // 用于存放倒计时时间
 public static Map<String,Long> map;
}

Then write timebutton.class to inherit from the button

package com.example.xuboyu.myapplication;

import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

/**
 * 倒计时按钮
 * @author bnuzlbs-xuboyu 2017/4/5.
 * 注意把该类的onCreate()onDestroy()和activity的onCreate()onDestroy()同步处理
 */
public class TimeButton extends Button implements OnClickListener {
 private long lenght = 60 * 1000;// 倒计时长度,这里给了认60秒
 private String textafter = "秒后重新获取~";
 private String textbefore = "点击获取验证码~";
 private int colorafter;
 private int colorbefore;
 private final String TIME = "time";
 private final String CTIME = "ctime";
 private OnClickListener mOnclickListener;
 private Timer t;
 private TimerTask tt;
 private long time;
 Map<String,Long> map = new HashMap<String,Long>();

 public TimeButton(Context context) {
 super(context);
 setOnClickListener(this);

 }

 public TimeButton(Context context,AttributeSet attrs) {
 super(context,attrs);
 setOnClickListener(this);
 }

 @SuppressLint("HandlerLeak")
 Handler han = new Handler() {
 public void handleMessage(android.os.Message msg) {
  TimeButton.this.setText(time / 1000 + textafter);
  time -= 1000;
  if (time < 0) {
  TimeButton.this.setEnabled(true);
  TimeButton.this.setText(textbefore);
  clearTimer();
  }
 };
 };

 private void initTimer() {
 time = lenght;
 t = new Timer();
 tt = new TimerTask() {

  @Override
  public void run() {
  Log.e("xuboyu",time / 1000 + "");
  han.sendEmptyMessage(0x01);//十六进制的数字1
  }
 };
 }

 private void clearTimer() {
 if (tt != null) {
  tt.cancel();
  tt = null;
 }
 if (t != null)
  t.cancel();
 t = null;
 }

 @Override
 public void setOnClickListener(OnClickListener l) {
 if (l instanceof TimeButton) {
  super.setOnClickListener(l);
 } else
  this.mOnclickListener = l;
 }

 @Override
 public void onClick(View v) {
 if (mOnclickListener != null)
  mOnclickListener.onClick(v);
 initTimer();
 this.setText(time / 1000 + textafter);
 this.setEnabled(false);
 t.schedule(tt,1000);
 // t.scheduleAtFixedRate(task,delay,period);
 }

 /**
 * 和activity的onDestroy()方法同步
 */
 public void onDestroy() {
 if (App.map == null)
  App.map = new HashMap<String,Long>();
 App.map.put(TIME,time);
 App.map.put(CTIME,System.currentTimeMillis());
 clearTimer();
 Log.e("xuboyu","onDestroy");
 }

 /**
 * 和activity的onCreate()方法同步
 */
 public void onCreate(Bundle bundle) {
 Log.e("xuboyu:倒计时相关",App.map + "");
 if (App.map == null)
  return;
 if (App.map.size() <= 0)// 这里表示没有上次未完成的计时
  return;
 long time = System.currentTimeMillis() - App.map.get(CTIME)
  - App.map.get(TIME);
 App.map.clear();
 if (time > 0)
  return;
 else {
  initTimer();
  this.time = Math.abs(time);
  t.schedule(tt,1000);
  this.setText(time + textafter);
  this.setEnabled(false);
 }
 }

 /** * 设置计时时候显示的文本 */
 public TimeButton setTextAfter(String text1) {
 this.textafter = text1;
 return this;
 }

 /** * 设置点击之前的文本 */
 public TimeButton setTextBefore(String text0) {
 this.textbefore = text0;
 this.setText(textbefore);
 return this;
 }

 /**
 * 设置到计时长度
 * @param lenght
 * 时间 认毫秒
 * @return
 */
 public TimeButton setLenght(long lenght) {
 this.lenght = lenght;
 return this;
 }
}

Finally, call in MainActivity.class.

package com.example.xuboyu.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

/**
 * 测试主界面
 * @author bnuzlbs-xuboyu 2017/4/5.
 */
public class MainActivity extends Activity implements OnClickListener {

 private TimeButton v;
 private TimeButton v2;
 private TimeButton v3;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 v = (TimeButton) findViewById(R.id.button1);
 v.onCreate(savedInstanceState);
 v.setTextAfter("秒后重新排队").setTextBefore("点击开始排队").setLenght(15 * 1000);
 v.setOnClickListener(this);

 v2 = (TimeButton) findViewById(R.id.button2);
 v2.onCreate(savedInstanceState);
 v2.setTextAfter("秒后重新验证").setTextBefore("点击发送验证码").setLenght(10 * 1000);
 v2.setOnClickListener(this);

 v3 = (TimeButton) findViewById(R.id.button3);
 v3.onCreate(savedInstanceState);
 v3.setTextAfter("秒后重新倒计时").setTextBefore("点击开始倒计时").setLenght(5 * 1000);
 v3.setOnClickListener(this);
 }

 @Override
 public void onClick(View v) {
 // TODO Auto-generated method stub
 Toast.makeText(MainActivity.this,"这是处理调用者onclicklistnenr",Toast.LENGTH_SHORT).show();
 }

 @Override
 protected void onDestroy() {
 // TODO Auto-generated method stub
 v.onDestroy();
 v2.onDestroy();
 super.onDestroy();
 }
}

The green button is a button with a custom style, which is also very simple to use

First, create a new style file mybutton.xml in drawable

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
 <solid android:color="#5cbe6c" />

 <!-- 设置按钮的四个角为弧形 -->
 <!-- android:radius 弧形的半径 -->
 <corners android:radius="15dip" />

 <!-- padding:Button里面的文字与Button边界的间隔 -->
 <padding
 android:bottom="10dp"
 android:left="10dp"
 android:right="10dp"
 android:top="10dp" />
</shape>

Then define the timebutton as follows:

android:background="@drawable/mybutton"

<com.example.xuboyu.myapplication.TimeButton
 android:id="@+id/button2"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text=""
 android:background="@drawable/mybutton"
 android:layout_margin="20dp"/>

The defined button style is as follows:

Remember to add the following to the application in androidmanifest.xml:

android:name=".App"

<application
 android:allowBackup="true"
 android:icon="@mipmap/ic_launcher"
 android:label="@string/app_name"
 android:supportsRtl="true"
 android:theme="@style/AppTheme"
 android:name=".App">
 <activity android:name=".MainActivity" >
  <intent-filter>
  <action android:name="android.intent.action.MAIN" />

  <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
 </activity>
</application>

PS. there is a problem with this countdown button. For long-time timing, the user may exit the application after timing. If the user puts our app in the background, then OK, our countdown can still be carried out. However, if the user slides the app process after exiting, or uses other software to clean the background, the ondestory method will be executed, When you enter the app again, you can only re-establish a timer. Therefore, the plan is to use lightweight storage to store the countdown data after each exit, and then assign a value to timer when oncreate is restarted. Of course, for short-time timing, that is, it is completely acceptable within the user's acceptable waiting range! A bug is also welcome to point out that when the application process is destroyed, the timer will also be destroyed. If you have a better solution, please give more advice!

The above is the whole content of this article. I hope it will help you in your study, and I hope you will support us a lot.

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>