Android 인증번호 카운트다운 표시 효과 가 져 오기

앞에서 타 이 머 를 타 는 시계 방향 두 가지 방법 을 말씀 드 렸 는데 동 영상 녹화 등에 서 많이 사용 되 었 습 니 다.오늘 은 카운트다운 이 이 루어 지 는 두 가지 방식 을 가 져 다 드 리 겠 습 니 다.
최근 에 쓴 것 은 모두 비교적 간단 하고 기초 가 있 지만 간단 하 다 고 해서 익숙 한 것 이 아니 라 기초 가 있다 고 해서 큰 소 가 돌아 가 는 것 이 아니 라 하,중 소 송아지 도 돌아 갈 수 있다.이것 은 초보 자 에 게 쓴 것 이다.
먼저 효과 도 를 만들어 라.

코드 실현 방식 도 매우 간단 합 니 다.여기 서 첫 번 째 실현 방식 을 추천 하고 여러분 에 게 도 적합 합 니 다.바로 Countdown Timer 를 직접 계승 하여 실현 하 는 것 입 니 다.
Countdown Timer 라 는 종 류 는 매우 간단 하기 때문에 이 를 계승 할 때 구조 방법 을 다시 쓰 고 가상 방법 을 실현 해 야 한다.
구조 방법의 두 매개 변 수 는 각각(카운트다운 시작 시간,간격)이다.
또 다른 두 가지 방법 은 onTick(아직 남 은 시간)입 니 다.시간 이 끝 난 후에 하고 싶 은 시간 은 onFinish()에서 할 수 있 습 니 다.
주의해 야 할 것 은 모든 시간 을 밀리초 형식 으로 하기 때문에 사용 할 때 1000 개의 장 사 를 제거 하 는 것 을 기억 해 야 한다.
그러나 제 가 사용 하 는 것 은 개인 내부 류 의 방식 으로 외부 류 에 인용 이 존재 하기 때문에 메모리 누 출 을 방지 하기 위해 Activity 가 소각 할 때 비 워 두 는 것 에 주의해 야 합 니 다.마찬가지 로 우 리 는 중복 생 성 대상 을 피해 야 합 니 다.
또 다른 방식 은 우리 가 자주 사용 하 는 Handler+Thread 방식 으로 이 루어 지 는 것 이다.그러나 이 루어 질 때 도 메모리 누 출 을 조심해 야 합 니 다.사용자 가 Activity 를 없 앨 때 타이머 스 레 드 가 순환 하지 않도록 주의해 야 합 니 다.이것 은 tag 탭 을 설정 하여 판단 할 수 있 습 니 다.
이렇게 소각 할 때 이 tag 라벨 을 false 로 설정 하여 스 레 드 의 실행 을 끝 냅 니 다!
다음은 구현 코드 입 니 다.

package com.example.nanchen.timerdemo;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

 private Button mBtnGetCode;
 private TimeCount mTimeCount;
 private Button mBtnGetCode2;
 private boolean timeFlag = true;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 mBtnGetCode = (Button) findViewById(R.id.main_btn_get_code);
 mBtnGetCode.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  mTimeCount = null;
  mTimeCount = new TimeCount(60 * 1000, 1000);
  mTimeCount.start();
  }
 });

 mBtnGetCode2 = (Button) findViewById(R.id.main_btn_get_code_2);
 mBtnGetCode2.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  mBtnGetCode2.setClickable(false);
  mBtnGetCode2.setBackgroundColor(getResources().getColor(R.color.btn_unable));
  timeFlag = true;
  new Thread() {
   @Override
   public void run() {
   super.run();
   for (int i = 59; i >= 0 && timeFlag; i--) {
    try {
    sleep(1000);
    Message msg = Message.obtain();
    msg.what = i;
    mHandler.sendMessage(msg);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
   }
   }
  }.start();
  }
 });
 }

 private Handler mHandler = new Handler() {
 @Override
 public void handleMessage(Message msg) {
  super.handleMessage(msg);
  if (msg.what > 0) {
  mBtnGetCode2.setText("(" + msg.what + ")    ");
  } else {
  mBtnGetCode2.setText("     ");
  mBtnGetCode2.setClickable(true);
  mBtnGetCode2.setBackgroundColor(getResources().getColor(R.color.colorAccent));
  }
 }


 };


 /**
 * Activity                ,      
 */
 @Override
 protected void onDestroy() {
 super.onDestroy();
 mTimeCount = null;
 timeFlag = false;
 }

 /**
 *        
 */
 private class TimeCount extends CountDownTimer {

 /**
  * @param millisInFuture The number of millis in the future from the call
  *    to {@link #start()} until the countdown is done and {@link #onFinish()}
  *    is called.
  * @param countDownInterval The interval along the way to receive
  *    {@link #onTick(long)} callbacks.
  */
 public TimeCount(long millisInFuture, long countDownInterval) {
  super(millisInFuture, countDownInterval);
 }

 /**
  *                   
  *
  * @param millisUntilFinished
  */
 @Override
 public void onTick(long millisUntilFinished) {
  mBtnGetCode.setClickable(false);
  mBtnGetCode.setBackgroundColor(getResources().getColor(R.color.btn_unable));
  mBtnGetCode.setText("(" + millisUntilFinished / 1000 + ")    ");
 }

 /**
  *       
  */
 @Override
 public void onFinish() {
  mBtnGetCode.setClickable(true);
  mBtnGetCode.setText("       1");
  mBtnGetCode.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
 }
 }


}
간단하게 xml 파일 을 보 겠 습 니 다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/activity_main"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.example.nanchen.timerdemo.MainActivity">

 <Button
 android:layout_marginTop="10dp"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:id="@+id/main_btn_get_code"
 android:text="       1"
 android:background="@color/colorPrimaryDark"/>

 <TextView
 android:layout_width="match_parent"
 android:layout_height="1dp"
 android:id="@+id/main_line1"
 android:background="@color/btn_unable"
 android:layout_below="@+id/main_btn_get_code"
 android:layout_marginTop="10dp"/>

 <Button
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_below="@+id/main_line1"
 android:layout_marginTop="10dp"
 android:text="       2"
 android:id="@+id/main_btn_get_code_2"
 android:background="@color/colorAccent"/>

</RelativeLayout>
마지막 으로 쓰 기:코드 와 실현 은 매우 간단 하지만,당신 은 힘 들 이지 않 을 것 입 니 다.하지만 전재 한다 면,본문 링크 를 남 겨 두 세 요~thank you!
github 링크:https://github.com/nanchen2251/TimerDemo
 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기