效果很简单,现在很多APP都有这种效果。

直接上效果图

先说一下源码地址吧,急用的同学直接拿去用
https://github.com/likangA/CountdownView/tree/master/library/src/main

用法:
XML中直接设置:

        app:center_text="跳过"app:center_text_color="@color/colorAccent"app:center_text_size="12sp"app:duration="5000"app:progress_color="@color/colorPrimary"app:progress_light_color="@color/colorAccent" 

Java:

        mCountdownView.setDuration(5000);mCountdownView.setProgressColor(0xFF3F51B5);mCountdownView.setProgressLightColor(0xFFFF4081);mCountdownView.setText("跳过");mCountdownView.setTextSize(12);mCountdownView.setTextColor(0xFFFF4081);mCountdownView.setCountdownListener(new CountdownView.CountdownListener() {@Overridepublic void onProgressListener(int progress, boolean isFinish) {if (isFinish) {Toast.makeText(MainActivity.this, "倒计时完成", Toast.LENGTH_SHORT).show();}}});mCountdownView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "跳过", Toast.LENGTH_SHORT).show();}});

第一步、自定义属性

res/values/attrs中添加下面自定义属性

<declare-styleable name="CountdownView"><attr name="duration" format="float"/>  <!-- 倒计时时长 --><attr name="progress_color" format="color"/>  <!-- 默认的时候进度颜色 --><attr name="progress_light_color" format="color"/>  <!-- 倒计时转过的进度颜色 --><attr name="center_text" format="string"/>  <!-- 中间文字 --><attr name="center_text_color" format="color"/>  <!-- 中间文字颜色 --><attr name="center_text_size" format="dimension"/>  <!-- 中间文字大小 -->
</declare-styleable>

获取自定属性

private void obtainAttr(AttributeSet attrs) {TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.CountdownView);mDuration = (long) (typedArray.getFloat(R.styleable.CountdownView_duration, 3) * 1000);mProgressColor = typedArray.getColor(R.styleable.CountdownView_progress_color,DEFAULT_PROGRESS_COLOR);mProgressLightColor = typedArray.getColor(R.styleable.CountdownView_progress_light_color,  DEFAULT_PROGRESS_LIGHT_COLOR);if (typedArray.hasValue(R.styleable.CountdownView_center_text)) {mCenterText = typedArray.getString(R.styleable.CountdownView_center_text);mIsShowInterval = false;}mTextColor = typedArray.getColor(R.styleable.CountdownView_center_text_color, DEFAULT_TEXT_COLOR);mTextSize = typedArray.getDimension(R.styleable.CountdownView_center_text_size, sp2px(getContext(), 12));typedArray.recycle();
}

画笔的基础设置

    private void initPaint() {//Paint config for default progress.默认进度画笔设置mProgressPaint = new Paint();mProgressPaint.setStrokeWidth(mProgressWidth = dip2px(getContext(), 3));mProgressPaint.setStyle(Paint.Style.STROKE);//Paint config for light progress.倒计时转过的画笔设置mProgressLightPaint = new Paint();mProgressLightPaint.setStrokeWidth(mProgressWidth = dip2px(getContext(), 3));mProgressLightPaint.setStyle(Paint.Style.STROKE);//Paint config for text progress.文字画笔设置mTextPaint = new Paint();mTextPaint.setStyle(Paint.Style.FILL);}

第一步的代码在构造函数中调用,第二步的代码在onDraw中调用

第二步、下面开始绘制,首先是默认状态下的进度条

就是一个圆圈

    private void drawProgress(Canvas canvas) {canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2 - mProgressWidth,mProgressPaint);}

倒计时转过的圆圈

    private void drawProgressLight(Canvas canvas) {//画布的方向是从X轴正方形开始为0度,但我们需要的是从Y轴正方向开始,所以画布需要逆时针旋转90度canvas.save();canvas.rotate(-90, getWidth() / 2, getHeight() / 2);RectF progressLightRect = new RectF(mProgressWidth, mProgressWidth,getWidth() - mProgressWidth, getHeight() - mProgressWidth);//扫过的角度大小float sweep = obtainPercent() * 360;canvas.drawArc(progressLightRect, 0, sweep, false, mProgressLightPaint);canvas.restore();}

obtainPercent函数是获取当前百分比进度,就一句话。可以看到红色扫过的长度跟mCurProgress有关

先手动给mCurProgress一个初始值,可以看到已经有了效果

    private float obtainPercent() {return (float) mCurProgress / 100;}

然后是中间的文字

    private void drawText(Canvas canvas) {Rect textBound = new Rect();mTextPaint.getTextBounds(mCenterText, 0, mCenterText.length(), textBound);Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();//文字垂直居中的y:getHeight() / 2 - fontMetrics.descent + (fontMetrics.descent - fontMetrics.ascent) / 2canvas.drawText(mCenterText, getWidth() / 2 - textBound.width() / 2,getHeight() / 2 - fontMetrics.descent + (fontMetrics.descent - fontMetrics.ascent) / 2,mTextPaint);}

文字垂直居中可以百度一下drawText怎么垂直居中。刚开始我也是很糊涂

第三步、该让红色自动画圆了

上面说道红色扫过的长度跟mCurProgress有关,所以只要能自动改变mCurProgress的值,扫过的红色自然就跟着变了,这里选择了ValueAnimator来控制

public void startAnim() {final ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100);valueAnimator.setDuration(mDuration);valueAnimator.setInterpolator(new LinearInterpolator());valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mCurProgress = (int) animation.getAnimatedValue();//...invalidate();}});valueAnimator.start();}

现在调用一下看效果

CountdownView mCountdownView = (CountdownView) findViewById(R.id.countdown);
mCountdownView.startAnim();

最后就是倒计时结束的监听了,我们用ValueAnimator实现的倒计时,所以监听也应该在ValueAnimator这实现,在ValueAnimator的onAnimationUpdate中添加几行代码即可

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mCurProgress = (int) animation.getAnimatedValue();mSurplusDuration = mDuration - animation.getCurrentPlayTime();//进度监听if (mCountdownListener != null) {mCountdownListener.onProgressListener(mCurProgress, mCurProgress == 100);}invalidate();}});

进度监听接口定义

    public interface CountdownListener {void onProgressListener(int progress, boolean isFinish);}

对了,如果想显示倒计时还剩多少秒的话可以去掉文字设置或者setCenterText(null)就行了。怎么实现的很简单,看一下源码就能看懂。效果:

好了,就是这么简单
其实学Android以来从来没怎么写过自定义View,博客更是没写过,感觉这篇更像是笔记吧,不过有个好的开端也是好的

自定义倒计时跳过按钮相关推荐

  1. Android_自定义倒计时View

    2016年08月01日新的一周开始了,一篇自定义倒计时View开启了这周的篇章- 国际惯例,效果图如下; 带阴影带指引点的倒计时View,不要被这下过吓到,分析一下,难点其实就是那个白色小圆圈的位置, ...

  2. 微信公众号开发--自定义菜单跳转页面并获取用户信息(续)

    之前写过一篇微信公众号开发–自定义菜单跳转页面并获取用户信息 由于当时是刚学习微信公众号开发当时的思路虽然可行,不过不是最好的,最近也用到了需要获取用户信息的地方,再次整理一下. 流程 注意点 ### ...

  3. 举个栗子!Tableau技巧(53):添加跳转按钮实现页面切换

    如何在仪表板(工作表)中添加跳转按钮,从而实现页面跳转呢? 本期<举个栗子>,阿达要给大家分享的 Tableau 技巧是:添加跳转按钮实现页面切换. 为方便学习,示例使用 Tableau ...

  4. iOS7 自定义动画跳转

    简介 在iOS7系统中,如果你使用短信或者appStore苹果原生的工具的时候会发现这么一个细节.UINavigationViewController中界面的Push不再是像iOS6的旧界面左移,新的 ...

  5. 游戏陪玩网站源码开发,搜索功能的实现与页面倒计时跳转

    在游戏陪玩网站源码开发时,首页会有一个搜索输入框和按钮区域,我们要做的就是来完善这部分功能.首先游戏陪玩网站源码搜索的逻辑,我们简单地设定为问题的title或者content包含搜索的关键字即可.假设 ...

  6. vue中的倒计时跳转页面问题和axios网络请求this作用域问题

    一.前言 这两个是在日常开发中碰到的问题,网上都能查得到答案,但是我怕自己会忘记,姑且记录一下用作笔记吧. 二.vue倒计时跳转问题 1.案例 比如我们在一次网络请求结束之后,如果返回结果是成功,则倒 ...

  7. js页面倒计时7天 java_javascript实现倒计时跳转页面

    本文给大家介绍了如何使用javascript实现倒计时跳转到其他页面的方法以及实现原理,非常的简单实用,有需要的小伙伴可以参考下. 很多网页都有类似的效果,那就是经过指定的时间能够跳转到其他页面,如果 ...

  8. 怎么修改谷歌浏览器文件提交按钮样式_使用css自定义input file浏览按钮样式

    前言 文件上传用途非常广泛,浏览器自带文件控件不太美观,很多时候不能满足需求,需要自定义input [type=file]的样式. 不同浏览器的file控件表现形式不一样 火狐 谷歌 IE 不同浏览器 ...

  9. asp登录页面跳转到注册页面_Java 添加页面跳转按钮到PDF文档

    概述 当我们在查阅含有大量页面的PDF时,可通过在页面上添加跳转按钮来实现页面转换,以达到节约时间,提高效率的目的.本文将通过Java程序来演示如何给PDF文档添加页面跳转按钮.通常来说跳转可分为两种 ...

  10. Cocos2dx 3.11版本 视频添加跳过按钮

    最近比较忙,这里不写原理只写代码,以后再补. 目前跨平台处理,只在Android和ios实现.其他平台暂时未加. 1.frameworks/cocos2d-x/cocos/ui/UIVideoPlay ...

最新文章

  1. 华胜天成ivcs云系统初体验2
  2. leetcode算法题--二叉树的镜像
  3. oracle的server_name,配置Oracle Name Server的完全步骤
  4. NEU 1497 Kid and Ants 思路 难度:0
  5. linux ccenteros 部署 redis
  6. 高倍数泡沫装置PHP_找煤机网:BGP高倍数泡沫灭火装置
  7. GARFIELD@10-18-2004
  8. 【报告分享】数实共生:未来经济白皮书2021-腾讯研究院.pdf(附下载链接)
  9. 如何在C++中集成LUA脚本(LuaWrapper For C++篇)
  10. php autosub,教你用PHP实现微信小程序人脸识别刷脸登录功能
  11. 小米手机解锁bootload教程及常见问题
  12. 10个成语理解项目管理的价值观和方法论
  13. 在线购物系统 问题描述、词汇表、领域类图
  14. 亲测win10安装mac虚拟机+网络配置完整过程
  15. 作业调度框架 Quartz 学习笔记(三) -- Cron表达式 (转载)
  16. 超简洁WIN10桌面分享
  17. php支付宝App支付生成预支付订单(统一下单接口)
  18. Kubernetes 二进制安装详细步骤
  19. 从《龙之战》想起 前一段时间,和江浙地区的企业信息化CIO们聊天,也深刻
  20. mysql 集合 思想_面向集合的思维编写SQL(第九篇 --- “我说的是:苹果柿子李子栗子梨的那个橘子啊”)...

热门文章

  1. C#读写内存也不差!(发布C#编写的植物大战僵尸作弊器源码)
  2. 溢出部分用省略号表示
  3. jeffery0207博客导航
  4. 音视频编辑软件哪个好
  5. 工作中常见的两种谬误
  6. 最适合编程的笔记本电脑是什么?
  7. TI GEL文件作用
  8. linux读取文件内容 cat,Linux 读取文件:cat 命令(拼接文件)
  9. 已知经纬度自动在地图上标点
  10. Python pass语句及其作用