概述

最近跟着扔物线的自定义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番茄时钟代码,一种实现极简番茄时钟的思路相关推荐

  1. 适合微信小程序作品的极简番茄时钟

    如果觉得有用,可以点赞关注我哦 结果图: 微信公众号新白者回复番茄闹钟可以得到源码 一.作品设计 小程序的理念是所见即所得,这是未来应用程序的理念;小程序是场景化的,核心场景在于线下的服务载体.纯线上 ...

  2. mac屏保时钟_OneClock 不息屏的极简时钟,不仅仅是翻页时钟那么简单!

    OneClock Mac时钟软件包括翻页时钟.数字时钟.表盘时钟,更多表盘三种样式.支持黑色和白色主题切换.透明度设置等设计. 不仅仅适配Mac 在iOS设备上,限于苹果并未开放任何屏保时钟.桌面时钟 ...

  3. android应用更新框架AppUpdateLib(仿苹果极简风格、高度自定义)支持androidX

    开发过程中,发现很多更新库定制样式比较费事(如自定义dialog功能不完善,更新dialog和下载dialog耦合高等),且功能不是特别契合需求(如使用dialogfragment封装难修改圆角.样式 ...

  4. java时钟代码_一个经典的JAVA APPLET时钟程序(一)

    转眼间一年又要过了,自己又老了一岁,郁闷啊.趁着还有几分钟才新年,赶快再发几篇文章,给过去的一年添点东西. 该程序是从网上发现的,是一个简单的时钟显示程序. 代码特色: 时钟代码提供了各种接口,可以在 ...

  5. 人形时钟代码php,[精品]炫酷的人形时钟代码

    分享一款:[精品]炫酷的人形时钟代码 你浪费的每一分每一秒的同时,别人在不停息的努力. 知识拓展: 如今我们只需瞧一下钟就能说出具体时间,我们把这看成是很自然的事.但在长达几千年的时间里,根本就没有任 ...

  6. html网页设计思路,极简主义网页设计思路与原则

    极简主义是一种风格,也是很多高级设计师都信奉的原则之一.它在室内装修设计,人物造型设计,时尚搭配服装设计,平面vi包装设计以及本文重点提到的网页设计等方面,都有着很多经典的案例.素马设计分享频道也分享 ...

  7. 分享一个开源的番茄计时器应用『极简番茄』和 统计图的库

    http://www.eoeandroid.com/thread-312728-1-1.html 实现的功能: 急速模式: 启动番茄时自动锁屏,完成时自动亮屏,让您能专注于手中工作(需在设置中开启) ...

  8. Android开发学习之路-Git的极简教程?

    Git是一个代码版本管理工具,也就是允许我们的一个项目拥有多个版本,这样我们可以随心所欲的修改我们的代码,如果出现问题,可以回退到某一个提交点.如果你还在用一堆堆注释来更新你的代码,那么可以尝试一下G ...

  9. python数码时钟代码_Python+Pyqt实现简单GUI电子时钟

    本文实例为大家分享了Python+Pyqt实现简单GUI电子时钟的具体代码,供大家参考,具体内容如下 突发奇想想用GUI做一个简单的电子时钟界面,利用pyqt模块也很方便,代码如下: from PyQ ...

最新文章

  1. 中计算散度的函数_理解 Kullback–Leibler 散度的近似
  2. python股票自动交易从零开始-python程序化交易编程-python制作自动交易程序!
  3. 使用CSS3悬停效果打造不同的页面版式
  4. IDEA导入Eclipse项目的方法步骤(图文教程)
  5. TCL语言笔记:TCL过程控制练习
  6. mysql集群原理剖析
  7. appcode破解方法
  8. 测试theano有无使用GPU
  9. git lfs linux,Git LFS 操作指南
  10. mysql netbeans_使用Netbeans操作MySQL数据库
  11. 公式图片转换成Word格式
  12. 树莓派4B搭建NAS系统(Samba)
  13. 关于两个Myeclipse共存的问题,同时激活的问题
  14. php微信聊天带语音,使用Html5多媒体实现微信语音功能
  15. 编程菜鸟到大鸟--代码积累
  16. 《Effective Python 编写高质量Python代码的59个有效方法》读书笔记
  17. 厨电新十年,不可逆的行业分化与老板电器的数字进化
  18. 怎么卸载apowerrec_录屏王ApowerREC Mac版卸载后,如何彻底删除Apowersoft Audio Device声音设备?...
  19. KMPlayer播放m2ts 格式文件
  20. heic图片上传失败

热门文章

  1. 基于DGL库图神经网络教程(1)——基本的建图操作
  2. 后天就是七夕节,你准备好了吗?送上几个七夕代码,展示你技能的时候到了!
  3. 生产库,查询库和测试库的区别
  4. 页面各手机屏幕的尺寸
  5. 华为不提示连接计算机,求告知为什么现在华为用usb连电脑手机不显示
  6. MySql ocp认证之备份与恢复(四)
  7. shell特殊符号cut命令,sort、wc、uniq命令,tee、tr、split命令
  8. Linux DMA 框架介绍,demengine.c文件
  9. 史记·孔子世家(强晟翻译版)
  10. python数据处理用什么软件_数据分析都会用到哪些工具?