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

android倒计时 是在原有TextView的基础上进行二次开发的自定义View

效果图

177c55183e14

这个主要是结合了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();

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频常见问题分析和解决:延迟(时延 delay)和抖动

延迟和抖动 延迟&#xff1a;是网络传输中的一个重要指标&#xff0c;测量了数据从一个端点到另外一个端点所需的时间。一般我们用毫秒作为其单位。通常我们也把延迟叫做延时&#xff0c;但是延时有时还会表示数据包发送端到接受端的往返时间。这个往返时间我们可以通过网络监…

forkjoin_应用ForkJoin –从最佳到快速

forkjoin到目前为止&#xff0c;JDK 7已很好地掌握在开发人员手中&#xff0c;并且大多数人都听说过ForkJoin&#xff0c;但是没有多少人有时间或机会去尝试它。 它引起了并且可能仍然引起一些混乱&#xff0c;与普通线程池有什么不同。 [1] 我在本文中的目标是通过一个代码示…

android usb触摸屏驱动 win10,Win10手机居然这样兼容安卓:直接运行apk!

摘要&#xff1a;“应用太少是硬伤&#xff01;”这是WP粉吐槽微软简洁而有力的一句话。最新的Win10Mobile预览版中首次引入了微软的安卓子系统&#xff0c;这也是微软推行的ProjectAstoria的一部分。那么Win10手机究竟要如何兼容安卓应用呢&#xff1f;微软最新一份招聘启事似…

Java应用程序中的验证

我经常看到的项目几乎没有任何有意识的数据验证策略。 他们的团队在截止日期&#xff0c;明确要求的巨大压力下工作&#xff0c;只是没有足够的时间以适当且一致的方式进行验证。 因此&#xff0c;数据验证代码随处可见&#xff1a;JavaScript片段&#xff0c;Java屏幕控制器&a…

升级鸿蒙系统如何退出,华为鸿蒙2.0系统升级了怎么退回EMUI11系统-操作教程详解...

华为鸿蒙2.0系统升级了怎么退回EMUI11系统&#xff1f;很多用户升级了又不知道如何才能退回到原来的系统&#xff0c;下面就让老铁下载小编为大家带来&#xff0c;2.0系统升级退回EMUI11系统操作教程详解。这次开启华为鸿蒙2.0系统手机开发者beta版公测招募的机型有华为P40 、P…

OpenFlow和SDN的历史和原理介绍

OpenFlow相关的历史、新闻&#xff1a;http://blog.csdn.net/jincm13/article/details/7825754 起源与发展 【https://36kr.com/p/5035985】   OpenFlow起源于斯坦福大学的Clean Slate项目组 [1] 。CleanSlate项目的最终目的是要重新发明英特网&#xff0c;旨在改变设计已略…

小米miuiVS华为鸿蒙,华为鸿蒙2.0 vs 小米MIUI 12.5

原标题&#xff1a;华为鸿蒙2.0 vs 小米MIUI 12.5不久前有媒体在视频中展示了鸿蒙2.0和苹果IOS14两个操作系统下App的启动速度&#xff0c;结果是鸿蒙2.0完胜IOS14。此后不久&#xff0c;该媒体发布了华为鸿蒙2.0和小米MIUI 12.5对比视频。同上次一样&#xff0c;这次依然是选择…

具有MicroProfile配置的可配置JAX-RS ExceptionMapper

当您使用JAX-RS创建REST服务时&#xff0c;通常要么不返回任何内容&#xff08;例如HTTP 201/2/4等&#xff09;&#xff0c;要么返回某些数据&#xff08;可能采用JSON格式&#xff08;因此HTTP 200&#xff09;&#xff0c;或者返回某些异常/错误&#xff08;例如HTTP 4xx或5…

Ad-hoc

Ad-hoc这个词来源于拉丁语&#xff0c;在百度上解释为“for this purpose only”&#xff0c;在wiki上解释为“for this”&#xff0c;其中文在wiki上被解释成包含特设的、特定目的的&#xff08;地&#xff09;、即席的、临时的、将就的、专案的”这么多种含义。在wireless ne…

android5.0 v4a,【图】多图讲解V4A提高G5音效详细步骤(G5音效可以更棒的)

首先感谢论坛前辈&#xff0c;看着你们介绍的方法&#xff0c;我把G5应有的音效搞出来了&#xff0c;效果提升非常明显。(看清了&#xff0c;如果不是非常明显&#xff0c;我也不会费这么大劲在这儿做讲解)。特记录和总结过程如下&#xff1a;1. 安装一键ROOT。2. 安装虚拟按…

Multi-commodity Flow Problem

多物网络流问题&#xff08;Multi-commodity Flow Problem&#xff09;是多种物品&#xff08;或货物&#xff09;在网络中从不同的源点流向不同的汇点的网络流问题。 定义

信干噪比、信噪比

信干噪比 名词定义 信干噪比SINR&#xff08;Signal to Interference plus Noise Ratio&#xff09;&#xff0c;指的是系统中信号与干扰和噪声之和的比。 信号是指来自设备外部需要通过设备进行处理的电子信号。 干扰是指系统本身以及异系统带来的干扰&#xff0c;如同频干扰…

矢量图标库如何引入html,Iconfont矢量图标库在网站中的使用方法

原标题&#xff1a;Iconfont矢量图标库在网站中的使用方法大家都知道现在移动端网站设计比较热门&#xff0c;由于移动端的网站页面的收缩性要求很高&#xff0c;必然在网页设计中&#xff0c;一些小点的图标&#xff0c;使用图片收缩性&#xff0c;以及美观上并不是很理想&…

弗林斯传输公式、天线温度

这是被称为弗林斯传输公式。这个等式关系 自由空间路径损耗&#xff0c;天线增益和波长 接收和发射功率。这是一个基本 在天线理论方程&#xff0c;应该记住的&#xff08;以及 上述推导&#xff09;。 弗林斯传输方程的另一种有用的形式是给定的公式[2]。自 波长和频率&#…

马尔可夫决策过程 Markov decision process MDP, 连续时间Markov chain, CMDP(全)

引言 在概率论及统计学中&#xff0c;马尔可夫过程&#xff08;英语&#xff1a;Markov process&#xff09;是一个具备了马尔可夫性质的随机过程&#xff0c;因为俄国数学家安德雷马尔可夫得名。马尔可夫过程是不具备记忆特质的&#xff08;memorylessness&#xff09;。换言…

Spring Boot完成示例

这篇文章提供了一个使用Spring Boot开发松耦合REST服务的完整示例。 使用spring boot&#xff0c;我们可以开发可独立运行的生产就绪Java应用程序&#xff0c;它是独立的应用程序&#xff0c;具有最小的依赖性&#xff0c;并且与其他应用程序的耦合较少。 大多数时候&#xff0…

最小生成树、最短路径树

一、最小生成树与最短路径树的区别 最小生成树能够保证整个拓扑图的所有路径之和最小&#xff0c;但不能保证任意两点之间是最短路径。 应用如网络部线&#xff0c;把所有的电脑(服务器&#xff1f;&#xff09;都连起来用的网线(光纤&#xff1f;&#xff09;最少&#xff0c…

卫星链路

卫星通信系统中&#xff0c;信息传输中&#xff0c;一条传输链路包括发端地球站、上行链路、卫星转发器、下行链路、收端地球站。按照空间分布可以分为星地链路和星间链路。影响其通信性能的因素主要有&#xff1a;发射端的发射功率与天线增益、传输过程中的损耗、传输过程中所…

计算机网络组成包括哪些内容,计算机网络系统的组成

互联网时代已经到来了&#xff0c;小编为你科普一下网络相关基础知识《计算机网络系统的组成》&#xff0c;让你更快融入互联网时代。计算机网络系统是通信子网和资源子网组成的。而网络软件系统和网络硬件系统是网络系统赖以存在的基础。在网络系统中&#xff0c;硬件对网络的…

正定和半正定

在众多的机器学习模型中&#xff0c;线性代数的身影无处不在&#xff0c;当然&#xff0c;我们也会时常碰到线性代数中的正定矩阵和半正定矩阵。例如&#xff0c;多元正态分布的协方差矩阵要求是半正定的。 ------------------------------------------ 1. 基本的定义 正定和…