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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 酷炫倒计时,android 好用的倒计时

發布時間:2023/12/2 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 酷炫倒计时,android 好用的倒计时 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

android倒計時 是在原有TextView的基礎上進行二次開發的自定義View

效果圖

這個主要是結合了android的CountDownTimer,這個一般就是發送短信的倒計時。

包含功能

倒計時時間超過一個小時顯示 時:分:秒

時間小于一小時顯示:分 :秒:毫秒

支持時間帶有邊框

實現思路

倒計時實現上可以通過Android的CountDownTimer進行時間上的倒計時功能

倒計時要有背景框,實現思路上有3個TextView設置,這個比較麻煩對于CountDownTimer回調回來的時間需要切割,怪麻煩的,還有一種就是 設計整個一個TextView,在TextView的onDraw()方法中,對它進行二次繪制,這樣就可以了

這里采用對就是一個TextView,對它的onDraw()進行二次繪制。

直接上代碼

package xx.xx.xx.widget;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.RectF;

import android.os.CountDownTimer;

import android.os.Parcel;

import android.os.Parcelable;

import android.support.annotation.Nullable;

import android.support.v7.widget.AppCompatTextView;

import android.util.AttributeSet;

import xx.xx.xx.R;

/**

* Created by odvl on 2016/12/5.

*/

public class CountDownTimeTextView extends AppCompatTextView {

private static final String SPLIT = " : ";

private static final String BLANK = " ";

private static final int RADIUS = 4;

static final long MS_IN_A_DAY = 1000 * 60 * 60 * 24;

static final long MS_IN_AN_HOUR = 1000 * 60 * 60;

static final long MS_IN_A_MINUTE = 1000 * 60;

static final long MS_IN_A_SECOND = 1000;

public static final String DEFAULT_TIME = " 00 : 00 : 00 ";

private String simTime = "";

private CountDownTimer timer;

private Paint borderPaint;

private boolean border = false;

public CountDownTimeTextView(Context context) {

super(context);

init(context, null);

}

public CountDownTimeTextView(Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

init(context, attrs);

}

public CountDownTimeTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init(context, attrs);

}

private void init(Context context, AttributeSet attrs) {

if (attrs != null) {

TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CountDownTimeTextView);

if (ta.hasValue(R.styleable.CountDownTimeTextView_border)) {

border = ta.getBoolean(R.styleable.CountDownTimeTextView_border, false);

borderPaint = new Paint();

borderPaint.setDither(true);

borderPaint.setAntiAlias(true);

borderPaint.setStyle(Paint.Style.STROKE);

borderPaint.setStrokeWidth(1f);

borderPaint.setColor(Color.parseColor("#999999"));

}

}

}

@Override

public Parcelable onSaveInstanceState() {

Parcelable parcelable = super.onSaveInstanceState();

SaveState ss = new SaveState(parcelable);

ss.text = simTime;

return ss;

}

@Override

public void onRestoreInstanceState(Parcelable state) {

SaveState ss = (SaveState) state;

super.onRestoreInstanceState(ss.getSuperState());

setText(ss.text);

}

static class SaveState extends BaseSavedState {

private String text;

public SaveState(Parcel source) {

super(source);

text = (String) source.readString();

}

public SaveState(Parcelable superState) {

super(superState);

}

@Override

public void writeToParcel(Parcel out, int flags) {

super.writeToParcel(out, flags);

out.writeString(text);

}

public static final Parcelable.Creator CREATOR = new Creator() {

@Override

public SaveState createFromParcel(Parcel source) {

return new SaveState(source);

}

@Override

public SaveState[] newArray(int size) {

return new SaveState[size];

}

};

}

public void setTime(long time, final OnFinishListener listener) {

if (timer != null) {

timer.cancel();

}

setText(DEFAULT_TIME);

timer = new CountDownTimer(time, 1) {

@Override

public void onTick(long l) {

if (l >= 1 * 60 * 60 * 1000) { //超過1小時

simTime = getTimeFromLong(l);

} else {

simTime = getMillisecondsTimes(l);

}

setText(simTime);

}

@Override

public void onFinish() {

setText(DEFAULT_TIME);

listener.onFinish();

}

};

}

private String getMillisecondsTimes(long l) {

l = l % MS_IN_AN_HOUR;

long minutes = l / MS_IN_A_MINUTE; //分

l = l % MS_IN_A_MINUTE;

long seconds = l / MS_IN_A_SECOND; //秒

l = l % MS_IN_A_SECOND;

long milliseconds = l / 10; //毫秒

StringBuffer sb = new StringBuffer();

if (minutes >= 10) {

sb.append(BLANK + String.valueOf(minutes) + SPLIT);

} else {

sb.append(BLANK + "0" + String.valueOf(minutes) + SPLIT);

}

if (seconds >= 10) {

sb.append(String.valueOf(seconds) + SPLIT);

} else {

sb.append("0" + String.valueOf(seconds) + SPLIT);

}

if (milliseconds >= 10) {

sb.append(String.valueOf(milliseconds) + BLANK);

} else {

sb.append("0" + String.valueOf(milliseconds) + BLANK);

}

String result = sb.toString();

return result;

}

public String getTimeFromLong(long diff) {

diff = diff % MS_IN_A_DAY;

long numHours = diff / MS_IN_AN_HOUR;

diff = diff % MS_IN_AN_HOUR;

long numMinutes = diff / MS_IN_A_MINUTE;

diff = diff % MS_IN_A_MINUTE;

long numSeconds = diff / MS_IN_A_SECOND;

StringBuffer buf = new StringBuffer();

if (numHours >= 10) { //hour

buf.append(BLANK + numHours + SPLIT);

} else if (numHours >= 0 && numHours < 10) {

buf.append(BLANK + "0" + numHours + SPLIT);

}

if (numMinutes >= 10) { //minutes

buf.append(numMinutes + SPLIT);

} else if (numMinutes >= 0 && numMinutes < 10) {

buf.append("0" + numMinutes + SPLIT);

}

if (numSeconds >= 10) { //seconds

buf.append(numSeconds + BLANK);

} else if (numSeconds >= 0 && numSeconds < 10) {

buf.append("0" + numSeconds + BLANK);

}

String result = buf.toString();

return result;

}

public void start() {

timer.start();

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

if (border) {

String text = getText().toString();

String[] result = text.split(":");

float[] length = new float[result.length];

float splitWidth = getPaint().measureText(":");

float blankWidth = getPaint().measureText(" ");

if (result.length > 0) {

float height = canvas.getHeight() - getPaddingBottom();

for (int i = 0; i < result.length; i++) {

float value = getPaint().measureText(result[i]);

length[i] = value;

}

if (result.length == 3) {

RectF r1 = new RectF((int) (getPaddingLeft() + blankWidth / 2), getPaddingTop(), (int) (getPaddingLeft() + length[0] - blankWidth / 2), (int) (getPaddingTop() + height));

RectF r2 = new RectF((int) (r1.right + blankWidth + splitWidth), getPaddingTop(), (int) (r1.right + splitWidth + length[1]), (int) (getPaddingTop() + height));

RectF r3 = new RectF((int) (r2.right + blankWidth + splitWidth), getPaddingTop(), (int) (r2.right + splitWidth + length[2]), (int) (getPaddingTop() + height));

canvas.drawRoundRect(r1, RADIUS, RADIUS, borderPaint);

canvas.drawRoundRect(r2, RADIUS, RADIUS, borderPaint);

canvas.drawRoundRect(r3, RADIUS, RADIUS, borderPaint);

} else {

return;

}

}

}

}

public interface OnFinishListener {

void onFinish();

}

}

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的android 酷炫倒计时,android 好用的倒计时的全部內容,希望文章能夠幫你解決所遇到的問題。

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