android番茄时钟代码,一种实现极简番茄时钟的思路
概述
最近跟着扔物线的自定义View教程重新复习了一波基础,但是API这种东西如果不用很容易就忘了,趁大脑还没触发GC之前,最好的记忆方式就是撸个Demo出来。iOS上有一款个人很喜欢的简约TODO应用叫极简待办,其中它的番茄时钟交互很适合用来练手。
分析
先看下iOS的效果图长啥样
功能
一个默认黑色的圆,一个灰色的圆,随着倒计时减少,灰色圆的弧度越来越大
手指在圆圈内滑动可以调整时间
心路历程
一步步来,先画一个黑圆以及显示时间文本,传入一个时间值后,可以实现倒计时功能。实现倒计时需要用到CountDownTimer,因此只要在该类的onTick中不断重绘就行了
public void start(){
new CountDownTimer(time * 1000 + 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
time = (time * 1000 - 1000) / 1000;
textTime = time + "";
invalidate();
}
@Override
public void onFinish() {
}
}.start();
}
通过setTime方法提前设置一分钟,运行后可以看到界面开始倒计时,
接着,开始倒计时后,画灰色的圆弧,这里需要用到动画ValueAnimator,通过ValueAnimator的getAnimatedValue()方法获取实时的动画值,计算灰色圆弧扫过的区域,修改start()方法如下:
public void start(){
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1.0f);
valueAnimator.setDuration(time * 1000);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
sweepVelocity = (float) animation.getAnimatedValue();
invalidate();
}
});
valueAnimator.start();
new CountDownTimer(time * 1000 + 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
time = (time * 1000 - 1000) / 1000;
textTime = time + "";
invalidate();
}
@Override
public void onFinish() {
}
}.start();
}
onDraw中:
mRectF.set(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
canvas.drawArc(mRectF, START_ANGLE, 360 * sweepVelocity, false, mPaint);
效果如下:
时间显示的有点挫,格式化下:
private String formatCountdownTime(int countdownTime) {
StringBuilder sb = new StringBuilder();
int minute = countdownTime / 60;
int second = countdownTime - 60 * minute;
if (minute < 10) {
sb.append("0" + minute + ":");
} else {
sb.append(minute + ":");
}
if (second < 10) {
sb.append("0" + second);
} else {
sb.append(second);
}
return sb.toString();
}
接下来就是实现上下滑动调整时间了,思路如下:
先确定一个最大值,这里取60分钟,我们可以获取到手指按下和滑动的坐标,如果这两个点的纵坐标差值刚好等于直径,那么显示的时间取最大值,其余的就在0-60的区间内,在滑动过程中执行重绘。
重写onTouchEvent方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
touchX = x;
touchY = y;
break;
case MotionEvent.ACTION_MOVE:
offsetX = x - touchX;
offsetY = y - touchY;
time = (int) (offsetY / 2 / radius * MAX_TIME);
if (time <= 0) {
time = 0;
}
textTime = formatTime(time);
countdownTime = time * 60;
invalidate();
break;
}
return true;
}
运行效果如下:
时间是可以调整了,但是当前没有对滑动范围限制,看到最大时间超出60分钟,处理的思路很简单,就是判断点是否在圆内,那怎么判断触摸点是否在圆内呢?平面内两点间距离公式和半径比较即可。
private boolean isContained(float x, float y) {
if (Math.sqrt((x - centerX) * (x - centerX) + (y - centerY) * (y - centerY)) > radius) {
return false;
} else {
return true;
}
}
最终效果:
android番茄时钟代码,一种实现极简番茄时钟的思路相关推荐
- 适合微信小程序作品的极简番茄时钟
如果觉得有用,可以点赞关注我哦 结果图: 微信公众号新白者回复番茄闹钟可以得到源码 一.作品设计 小程序的理念是所见即所得,这是未来应用程序的理念;小程序是场景化的,核心场景在于线下的服务载体.纯线上 ...
- mac屏保时钟_OneClock 不息屏的极简时钟,不仅仅是翻页时钟那么简单!
OneClock Mac时钟软件包括翻页时钟.数字时钟.表盘时钟,更多表盘三种样式.支持黑色和白色主题切换.透明度设置等设计. 不仅仅适配Mac 在iOS设备上,限于苹果并未开放任何屏保时钟.桌面时钟 ...
- android应用更新框架AppUpdateLib(仿苹果极简风格、高度自定义)支持androidX
开发过程中,发现很多更新库定制样式比较费事(如自定义dialog功能不完善,更新dialog和下载dialog耦合高等),且功能不是特别契合需求(如使用dialogfragment封装难修改圆角.样式 ...
- java时钟代码_一个经典的JAVA APPLET时钟程序(一)
转眼间一年又要过了,自己又老了一岁,郁闷啊.趁着还有几分钟才新年,赶快再发几篇文章,给过去的一年添点东西. 该程序是从网上发现的,是一个简单的时钟显示程序. 代码特色: 时钟代码提供了各种接口,可以在 ...
- 人形时钟代码php,[精品]炫酷的人形时钟代码
分享一款:[精品]炫酷的人形时钟代码 你浪费的每一分每一秒的同时,别人在不停息的努力. 知识拓展: 如今我们只需瞧一下钟就能说出具体时间,我们把这看成是很自然的事.但在长达几千年的时间里,根本就没有任 ...
- html网页设计思路,极简主义网页设计思路与原则
极简主义是一种风格,也是很多高级设计师都信奉的原则之一.它在室内装修设计,人物造型设计,时尚搭配服装设计,平面vi包装设计以及本文重点提到的网页设计等方面,都有着很多经典的案例.素马设计分享频道也分享 ...
- 分享一个开源的番茄计时器应用『极简番茄』和 统计图的库
http://www.eoeandroid.com/thread-312728-1-1.html 实现的功能: 急速模式: 启动番茄时自动锁屏,完成时自动亮屏,让您能专注于手中工作(需在设置中开启) ...
- Android开发学习之路-Git的极简教程?
Git是一个代码版本管理工具,也就是允许我们的一个项目拥有多个版本,这样我们可以随心所欲的修改我们的代码,如果出现问题,可以回退到某一个提交点.如果你还在用一堆堆注释来更新你的代码,那么可以尝试一下G ...
- python数码时钟代码_Python+Pyqt实现简单GUI电子时钟
本文实例为大家分享了Python+Pyqt实现简单GUI电子时钟的具体代码,供大家参考,具体内容如下 突发奇想想用GUI做一个简单的电子时钟界面,利用pyqt模块也很方便,代码如下: from PyQ ...
最新文章
- 中计算散度的函数_理解 Kullback–Leibler 散度的近似
- python股票自动交易从零开始-python程序化交易编程-python制作自动交易程序!
- 使用CSS3悬停效果打造不同的页面版式
- IDEA导入Eclipse项目的方法步骤(图文教程)
- TCL语言笔记:TCL过程控制练习
- mysql集群原理剖析
- appcode破解方法
- 测试theano有无使用GPU
- git lfs linux,Git LFS 操作指南
- mysql netbeans_使用Netbeans操作MySQL数据库
- 公式图片转换成Word格式
- 树莓派4B搭建NAS系统(Samba)
- 关于两个Myeclipse共存的问题,同时激活的问题
- php微信聊天带语音,使用Html5多媒体实现微信语音功能
- 编程菜鸟到大鸟--代码积累
- 《Effective Python 编写高质量Python代码的59个有效方法》读书笔记
- 厨电新十年,不可逆的行业分化与老板电器的数字进化
- 怎么卸载apowerrec_录屏王ApowerREC Mac版卸载后,如何彻底删除Apowersoft Audio Device声音设备?...
- KMPlayer播放m2ts 格式文件
- heic图片上传失败
热门文章
- 基于DGL库图神经网络教程(1)——基本的建图操作
- 后天就是七夕节,你准备好了吗?送上几个七夕代码,展示你技能的时候到了!
- 生产库,查询库和测试库的区别
- 页面各手机屏幕的尺寸
- 华为不提示连接计算机,求告知为什么现在华为用usb连电脑手机不显示
- MySql ocp认证之备份与恢复(四)
- shell特殊符号cut命令,sort、wc、uniq命令,tee、tr、split命令
- Linux DMA 框架介绍,demengine.c文件
- 史记·孔子世家(强晟翻译版)
- python数据处理用什么软件_数据分析都会用到哪些工具?