自定义倒计时跳过按钮
效果很简单,现在很多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,博客更是没写过,感觉这篇更像是笔记吧,不过有个好的开端也是好的
自定义倒计时跳过按钮相关推荐
- Android_自定义倒计时View
2016年08月01日新的一周开始了,一篇自定义倒计时View开启了这周的篇章- 国际惯例,效果图如下; 带阴影带指引点的倒计时View,不要被这下过吓到,分析一下,难点其实就是那个白色小圆圈的位置, ...
- 微信公众号开发--自定义菜单跳转页面并获取用户信息(续)
之前写过一篇微信公众号开发–自定义菜单跳转页面并获取用户信息 由于当时是刚学习微信公众号开发当时的思路虽然可行,不过不是最好的,最近也用到了需要获取用户信息的地方,再次整理一下. 流程 注意点 ### ...
- 举个栗子!Tableau技巧(53):添加跳转按钮实现页面切换
如何在仪表板(工作表)中添加跳转按钮,从而实现页面跳转呢? 本期<举个栗子>,阿达要给大家分享的 Tableau 技巧是:添加跳转按钮实现页面切换. 为方便学习,示例使用 Tableau ...
- iOS7 自定义动画跳转
简介 在iOS7系统中,如果你使用短信或者appStore苹果原生的工具的时候会发现这么一个细节.UINavigationViewController中界面的Push不再是像iOS6的旧界面左移,新的 ...
- 游戏陪玩网站源码开发,搜索功能的实现与页面倒计时跳转
在游戏陪玩网站源码开发时,首页会有一个搜索输入框和按钮区域,我们要做的就是来完善这部分功能.首先游戏陪玩网站源码搜索的逻辑,我们简单地设定为问题的title或者content包含搜索的关键字即可.假设 ...
- vue中的倒计时跳转页面问题和axios网络请求this作用域问题
一.前言 这两个是在日常开发中碰到的问题,网上都能查得到答案,但是我怕自己会忘记,姑且记录一下用作笔记吧. 二.vue倒计时跳转问题 1.案例 比如我们在一次网络请求结束之后,如果返回结果是成功,则倒 ...
- js页面倒计时7天 java_javascript实现倒计时跳转页面
本文给大家介绍了如何使用javascript实现倒计时跳转到其他页面的方法以及实现原理,非常的简单实用,有需要的小伙伴可以参考下. 很多网页都有类似的效果,那就是经过指定的时间能够跳转到其他页面,如果 ...
- 怎么修改谷歌浏览器文件提交按钮样式_使用css自定义input file浏览按钮样式
前言 文件上传用途非常广泛,浏览器自带文件控件不太美观,很多时候不能满足需求,需要自定义input [type=file]的样式. 不同浏览器的file控件表现形式不一样 火狐 谷歌 IE 不同浏览器 ...
- asp登录页面跳转到注册页面_Java 添加页面跳转按钮到PDF文档
概述 当我们在查阅含有大量页面的PDF时,可通过在页面上添加跳转按钮来实现页面转换,以达到节约时间,提高效率的目的.本文将通过Java程序来演示如何给PDF文档添加页面跳转按钮.通常来说跳转可分为两种 ...
- Cocos2dx 3.11版本 视频添加跳过按钮
最近比较忙,这里不写原理只写代码,以后再补. 目前跨平台处理,只在Android和ios实现.其他平台暂时未加. 1.frameworks/cocos2d-x/cocos/ui/UIVideoPlay ...
最新文章
- 华胜天成ivcs云系统初体验2
- leetcode算法题--二叉树的镜像
- oracle的server_name,配置Oracle Name Server的完全步骤
- NEU 	1497 Kid and Ants 思路 难度:0
- linux ccenteros 部署 redis
- 高倍数泡沫装置PHP_找煤机网:BGP高倍数泡沫灭火装置
- GARFIELD@10-18-2004
- 【报告分享】数实共生:未来经济白皮书2021-腾讯研究院.pdf(附下载链接)
- 如何在C++中集成LUA脚本(LuaWrapper For C++篇)
- php autosub,教你用PHP实现微信小程序人脸识别刷脸登录功能
- 小米手机解锁bootload教程及常见问题
- 10个成语理解项目管理的价值观和方法论
- 在线购物系统 问题描述、词汇表、领域类图
- 亲测win10安装mac虚拟机+网络配置完整过程
- 作业调度框架 Quartz 学习笔记(三) -- Cron表达式 (转载)
- 超简洁WIN10桌面分享
- php支付宝App支付生成预支付订单(统一下单接口)
- Kubernetes 二进制安装详细步骤
- 从《龙之战》想起 前一段时间,和江浙地区的企业信息化CIO们聊天,也深刻
- mysql 集合 思想_面向集合的思维编写SQL(第九篇 --- “我说的是:苹果柿子李子栗子梨的那个橘子啊”)...