Android 사용자 정의 View 등록 인증 코드 카운트다운 버튼 가 져 오기
1.효과 도 를 먼저 본다
2.우리 가 관련 된 변수
// ,
/**
* , 60 ;
*/
private long length = 60 * 1000;
//
/**
* ,
*/
private String beforeText = " ";
//
/**
* ,
*/
private String afterText = " ";
3.어떤 카운트다운 타 이 머 를 이용 하 는가자바 에서 타이머 작업 을 수행 하려 면 두 가지 기본 클래스 가 필요 합 니 다.
java.util.Timer;
java.util.TimerTask;
정시 작업 을 실행 하려 면 가장 기본 적 인 절 차 는 다음 과 같 습 니 다.
1.수행 할 작업 을 만 듭 니 다.Timer Task.
2.Timer 인 스 턴 스 를 만 들 고 Timer 가 제공 하 는 schedule()방법 을 통 해 Timer Task 를 타이머 Timer 에 추가 하고 실행 하 는 규칙 을 설정 하면 됩 니 다.
프로그램 이 Timer 초기 화 코드 를 실행 하면 Timer 정시 작업 은 설정 에 따라 실 행 됩 니 다.
Timer 의 schedule()방법 은 여러 가지 재 부팅 형식 으로 서로 다른 상황 에 적응 합 니 다.이 방법의 형식 은 다음 과 같다.
void schedule(TimerTask task, Date time)
지정 한 시간 에 지정 한 임 무 를 수행 하도록 안배 하 다.
void schedule(TimerTask task, Date firstTime, long period)
지정 한 작업 을 지정 한 시간 에 반복 되 는 고정 지연 실행 을 시작 하도록 설정 합 니 다.
void schedule(TimerTask task, long delay)
지정 지연 후 지정 한 작업 을 수행 하도록 배정 합 니 다.
void schedule(TimerTask task, long delay, long period)
지정 한 작업 을 지정 한 지연 후부 터 반복 되 는 고정 지연 실행 을 진행 하도록 배정 합 니 다.
Timer 는 스 레 드 가 안전 합 니 다.동시에 배정 되 는 작업 으로 확장 할 수 있 습 니 다(수천 개 에 문제 가 없습니다).모든 구조 방법 이 타이머 스 레 드 를 시작 합 니 다.cancel()을 호출 하여 이 타 이 머 를 종료 하고 현재 설정 한 모든 작업 을 버 릴 수 있 습 니 다.Purge()이 타이머 의 작업 대기 열 에서 취 소 된 모든 작업 을 제거 합 니 다.이 는 실시 간 보증 을 제공 하지 않 습 니 다.Object.wait(long)방법 으로 작업 을 배정 합 니 다.
Timer Task 는 추상 적 인 클래스 로 Timer 가 한 번 에 실행 하거나 반복 하 는 작업 으로 배정 합 니 다.그것 은 추상 적 인 방법 인 run()-타이머 임무 가 수행 해 야 할 조작 이 있다.따라서 모든 구체 적 인 작업 클래스 는 Timer Task 클래스 를 계승 하고 run()방법 을 다시 써 야 합 니 다.그리고 그것 은 두 가지 추상 적 이지 않 은 방법 이 있다.
boolean cancel()
이 타이머 작업 을 취소 합 니 다.
long scheduledExecutionTime()
이 작업 의 최근 실제 실행 시간 을 되 돌려 줍 니 다.
4.코드
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
import java.util.Timer;
import java.util.TimerTask;
/**
*
* <p/>
*
* @author Dylan
* [ BUG]
* Created by Dylan on 2016/10/5 0005.
*/
public class CountdownButton extends Button implements View.OnClickListener {
/**
* , 60 ;
*/
private long length = 60 * 1000;
/**
* ,
*/
private Timer timer;
/**
*
*/
private TimerTask timerTask;
/**
* ,
*/
private String beforeText = " ";
/**
* ,
*/
private String afterText = " ";
/**
*
*/
private OnClickListener onClickListener;
public CountdownButton(Context context) {
super(context);
initView();
}
public CountdownButton(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public CountdownButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
/**
*
*/
private void initView() {
if (!TextUtils.isEmpty(getText())) {
beforeText = getText().toString().trim();
}
this.setText(beforeText);
setOnClickListener(this);
}
/**
*
*/
private void initTimer() {
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(1);
}
};
}
/**
*
*
* @param length
*/
public void setLength(long length) {
this.length = length;
}
/**
*
*
* @param beforeText
*/
public void setBeforeText(String beforeText) {
this.beforeText = beforeText;
}
/**
*
*
* @param beforeText
*/
public void setAfterText(String beforeText) {
this.afterText = afterText;
}
/**
*
*
* @param onclickListener
*/
@Override
public void setOnClickListener(OnClickListener onclickListener) {
if (onclickListener instanceof CountdownButton) {
super.setOnClickListener(onclickListener);
} else {
this.onClickListener = onclickListener;
}
}
/**
*
*
* @param v
*/
@Override
public void onClick(View v) {
start();
if (onClickListener != null) {
onClickListener.onClick(v);
}
}
/**
*
*/
public void start() {
initTimer();
this.setText(length / 1000 + afterText);
this.setEnabled(false);
timer.schedule(timerTask, 0, 1000);
}
/**
*
*/
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
CountdownButton.this.setText(length / 1000 + afterText);
length -= 1000;
if (length < 0) {
CountdownButton.this.setEnabled(true);
CountdownButton.this.setText(beforeText);
clearTimer();
length = 60 * 1000;
}
}
};
/**
*
*/
private void clearTimer() {
if (timerTask != null) {
timerTask.cancel();
timerTask = null;
}
if (timer != null) {
timer.cancel();
timer = null;
}
}
/**
* activity fragment ,
* ,
*
*/
@Override
protected void onDetachedFromWindow() {
clearTimer();
super.onDetachedFromWindow();
}
}
5.용법,아주 간단
<com.bm.ykzx.view.CountdownButton
android:id="@+id/cdb_register_timer"
android:layout_width="120dp"
android:textAllCaps="false"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:gravity="center"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:text=" "
android:textColor="#1179c4"
android:textSize="@dimen/txt14sp" />
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.