日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android自定义秒表,Android自定义Chronometer实现短信验证码秒表倒计时功能

發布時間:2024/5/8 Android 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android自定义秒表,Android自定义Chronometer实现短信验证码秒表倒计时功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文實例為大家分享了Chronometer實現倒計時功能,Android提供了實現按照秒計時的API,供大家參考,具體內容如下

一、自定義ChronometerView 繼續自TextView

主要原理:先設置一個基準倒計時時間mBaseSeconds,內置handler 每隔1s發送一個空消息,mRemainSeconds--,同時刷新界面視圖,回調給外部調用者,只到為零。外部調用者可通過start()/pause()/stop()來控制計時器的工作狀態。

可以app中發送短信驗證碼的場景為例,做了一個很粗糙的界面,但功能都實現了。

/**

* @name 倒計時器(類似妙表倒數計時,支持暫停、停止、重新開始)

* @author Fanjb

* @date 2015年11月6日

*/

public class ChronometerView extends TextView {

/**

* A callback that notifies when the chronometer has decremented on its own.

*

* @author Fanjb

*/

public interface OnTickChangeListener {

/**

* remain seconds changed

*

* @param view

* @param remainSeconds

*/

public void onTickChanged(ChronometerView view, long remainSeconds);

}

private long mBase;

private long mRemainSeconds;

private boolean mStarted;

private boolean mReStart;

private boolean mVisible;

private boolean mIsEnable;

private OnTickChangeListener mTickListener;

public ChronometerView(Context context) {

this(context, null);

}

public ChronometerView(Context context, AttributeSet attrs) {

super(context, attrs, 0);

}

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

super(context, attrs, defStyleAttr);

updateText(mRemainSeconds);

}

@Override

protected void onWindowVisibilityChanged(int visibility) {

super.onWindowVisibilityChanged(visibility);

mVisible = visibility == VISIBLE;

updateStatus();

}

@Override

protected void onDetachedFromWindow() {

super.onDetachedFromWindow();

mVisible = false;

updateStatus();

}

/**

* 啟動計時器

*/

public void start() {

if (mReStart && !mStarted) {

mRemainSeconds = mBase;

}

mStarted = true;

updateStatus();

}

/**

* 暫停計時器

*/

public void pause() {

if (mStarted) {

mStarted = mReStart = false;

updateStatus();

}

}

/**

* 停止計時器,再次調用 start()重新啟動

*/

public void stop() {

mStarted = false;

mReStart = true;

updateStatus();

updateText(mRemainSeconds = 0);

dispatchTickListener();

}

/**

* 刷新內部狀態

*/

private void updateStatus() {

boolean isEnable = mVisible && mStarted;

if (mIsEnable != isEnable) {

if (isEnable) {

mHandler.sendMessage(Message.obtain(mHandler, TICK_WHAT));

} else {

mHandler.removeMessages(TICK_WHAT);

}

mIsEnable = isEnable;

}

}

private static final int TICK_WHAT = 1;

private Handler mHandler = new Handler() {

public void handleMessage(android.os.Message msg) {

if (mRemainSeconds > 0) {

updateText(--mRemainSeconds);

dispatchTickListener();

sendMessageDelayed(Message.obtain(this, TICK_WHAT), 1000);

}

}

};

private void updateText(long now) {

String text = DateUtils.formatElapsedTime(now);

setText(text);

}

/**

* 在未啟動狀態下設置開始倒計時時間

*

* @param baseSeconds

*/

public void setBaseSeconds(long baseSeconds) {

if (baseSeconds > 0 && baseSeconds != mBase && !mStarted) {

mBase = mRemainSeconds = baseSeconds;

updateText(mRemainSeconds);

}

}

/**

* 剩余時間

*

* @return

*/

public long getRemainSeconds() {

return mRemainSeconds;

}

public void setOnTickChangeListener(OnTickChangeListener listener) {

mTickListener = listener;

}

public OnTickChangeListener getTickListener() {

return mTickListener;

}

private void dispatchTickListener() {

if (mTickListener != null) {

mTickListener.onTickChanged(this, getRemainSeconds());

}

}

@Override

public void onInitializeAccessibilityEvent(AccessibilityEvent event) {

super.onInitializeAccessibilityEvent(event);

event.setClassName(ChronometerView.class.getName());

}

@Override

public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {

super.onInitializeAccessibilityNodeInfo(info);

info.setClassName(Chronometer.class.getName());

}

}

二、xml 中沒有加入自定義的控件屬性,同TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="horizontal" >

android:id="@+id/chronometer_view"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="5dp"

android:background="@drawable/chronometer_view_bg"

android:enabled="true"

android:text="00:00" />

android:id="@+id/start_chronometer_view_btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="5dp"

android:text="Start" />

android:id="@+id/pause_chronometer_view_btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="5dp"

android:text="Pause" />

android:id="@+id/stop_chronometer_view_btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="5dp"

android:text="Stop" />

三、在Activity中做一個簡單的測試(可以發送短信驗證碼的實際應用場景為例)

public class ChronometerActivity extends Activity {

private ChronometerView mChronometerView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_clock);

// 自定義計時器

if (mChronometerView == null) {

mChronometerView = (ChronometerView) findViewById(R.id.chronometer_view);

mChronometerView.setBaseSeconds(60);

mChronometerView.setOnTickChangeListener(new OnTickChangeListener() {

@Override

public void onTickChanged(ChronometerView view, long curTimeMills) {

System.out.println(curTimeMills);

view.setEnabled(curTimeMills == 0 || curTimeMills == 60);

if (curTimeMills == 0) {

mChronometerView.setText("重新發送");

}

}

});

mChronometerView.setText("點擊發送驗證碼");

}

findViewById(R.id.start_chronometer_view_btn).setOnClickListener(mClickListener);

findViewById(R.id.pause_chronometer_view_btn).setOnClickListener(mClickListener);

findViewById(R.id.stop_chronometer_view_btn).setOnClickListener(mClickListener);

}

private View.OnClickListener mClickListener = new OnClickListener() {

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.start_chronometer_view_btn:

if (mChronometerView != null) {

mChronometerView.start();

}

break;

case R.id.pause_chronometer_view_btn:

if (mChronometerView != null) {

mChronometerView.pause();

}

break;

case R.id.stop_chronometer_view_btn:

if (mChronometerView != null) {

mChronometerView.stop();

}

break;

}

}

};

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的android自定义秒表,Android自定义Chronometer实现短信验证码秒表倒计时功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。