原标题:如何使用Kotlin构建Android旋转旋钮以帮助儿子练习钢琴

当我儿子的钢琴老师告诉他应该使用节拍器练习计时时,我借此机会使用了Kotlin。我决定使用编程语言和Android的生态系统,以便构建Metronome应用程序。

我最初的实现使用SeekBar来控制BPM(每分钟节拍数)-节拍器滴答声的速率。但是,随着项目的进行,我想使其像一个物理数字单元,就像现实世界中许多音乐家所使用的那样。物理单位没有“ SeekBar视图”,我想模拟实际单位可能具有的旋钮。旋钮是非常有用的UI控件。它们很像滑块或SeekBar,可在许多情况下使用。以下是它们的一些优点:他们在您的应用中消耗的很少,它们可用于控制值的连续或离散范围,用户可以立即从实际应用程序中识别它们,它们不是标准的Android控件,因此可为您的应用赋予独特的“自定义”感觉,尽管存在一些适用于Android的开放源代码旋钮库,但我在任何一个库中都找不到我想要的东西。,对于我的适度需求,许多工具都有些过分了,例如设置背景图像或处理两个或多个模式操作的水龙头等。有些工具没有我想适合我的项目的可定制性,而是带有自己的旋钮图像。还有一些假设值或位置的离散范围。而且其中许多似乎比需要的要复杂得多。因此,我决定自己设计一个,这就变成了一个有趣的小项目了。在本文中,我将讨论如何构建它。下面这个就是成品。

节拍器应用程序及其旋钮

因此,让我们看看如何创建一个旋钮。

设计旋钮

第一步是为旋钮本身创建图形。我不是一个设计师,但是我想到在旋钮控件中营造“深度”和运动感的关键是使用偏心的径向渐变。这将使我产生表面凹陷和光反射的错觉。我使用Sketch绘制了旋钮,然后将其导出到svg。然后,将其作为可绘制对象导入Android Studio。

在xml中创建视图

创建视图的第一步是在res / layout文件夹中创建一个xml布局文件。可以使用代码完全创建视图,但是应该使用xml创建Android中良好的可重用视图。

注意标记-我们将使用它,因为我们将扩展现有的Android Layout类,并且此布局将是该布局的内部结构。我们将对旋钮使用ImageView,并随着用户移动它进行旋转。

为了使该旋钮可通过xml配置,我们将为该旋钮将返回的值的范围以及用于可视化的drawable创建属性。我们将在res / values下创建一个attrs.xml文件。

接下来,创建一个新的Kotlin类文件RotaryKnobView,该文件扩展了RelativeLayout并实现了接口GestureDetector.OnGestureListener。

我们将使用RelativeLayout作为控件的父容器,并实现OnGestureListener来处理旋钮的移动手势。接下来,我们将初始化一些默认值并定义类成员。

关于分频器变量的注释-我希望旋钮具有开始和结束位置,而不是能够无限旋转,就像立体声系统上的音量旋钮一样。我将起点和终点分别设置为-150度和150度。因此,旋钮的有效运动仅为300度。

我们将使用除法器来分配希望旋钮在这些可用的300度上返回的值的范围-以便我们可以根据旋钮的位置角度来计算实际值。

接下来,我们初始化组件:

1、放大布局。

2、将属性读入变量。

3、更新除法器(以支持传入的最小值和最大值)

4、设置图像。

由于我们需要实现OnGestureListener的功能,因此该类尚未编译,让我们现在去处理吧。

检测用户手势

OnGestureListener接口要求我们实现六个功能:

onScroll,onTouchEvent,onDown,onSingleTapUp,onFling,onLongPress,onShowPress。其中,我们需要在onDown和onTouchEvent上使用(返回true),并在onScroll中实现移动登录。

这是onScroll的实现。我们将在以下段落中填写缺失的部分。

onScroll接收两个坐标集e1和e2,分别表示触发事件的滚动的开始和结束运动。我们只对e2(旋钮的新位置)感兴趣,因此我们可以对其进行动画处理以定位并计算值。我使用的功能将在下一部分中进行回顾,以计算旋转角度。如前所述,我们仅使用从旋钮的起点到终点的300度,因此在这里,我们还使用分频器计算旋钮的位置应代表什么值。

计算旋转角度

现在,让我们编写calculateAngle函数。

该功能需要一些解释和一些初一年级数学。(噢~还好我数学考试通常都是及格的不然还真不会,建议数学不好的朋友重新回去复习一下初一年级的数学)

此功能的目的是根据传递的坐标以角度计算旋钮的位置。我选择将旋钮的12点钟位置视为零,然后在顺时针旋转时将其位置增加到正数,在从12点逆时针旋转时减少到负数。

我们从onScroll函数获取x,y坐标,指示视图在该运动中结束的位置(针对该事件)。x和y代表笛卡尔坐标系上的一个点。我们可以将该点表示转换为极坐标系,以x轴上方或下方的角度以及该点与极点的距离来表示该点。

可以使用atan2函数在两个坐标系之间进行转换。对我们来说幸运的是,与大多数数学库一样,Kotlin数学库为我们提供了atan2的实现。但是,我们确实需要考虑旋钮模型和简单的数学实现之间的一些差异。(0,0)坐标表示视图的右上角,而不是中间。并且,当x坐标沿正确的方向前进时(随着向右移动而增长),y坐标向后移动。0是视图的顶部,而视图的高度值是该视图中的最低像素线。

为了适应这种情况,我们将x和y分别除以视图的宽度和高度,以使其归一化为0–1。然后我们从两者中减去0.5,将0,0点移到中间。最后,我们从1中减去y的值以反转其方向。

极坐标系与我们所需的方向相反。随着我们逆时针旋转,度数值会增加。因此,我们添加了一个负号来反转atan2函数的结果。我们希望0度的值指向北,否则经过9点,该值将从0跳到359。

因此我们将结果加90,注意,一旦角度大于180,将值减小360。因此我们得到-180

最后但并非最不重要的一点,我们为使用中的Activity或Fragment提供一个接口,以监听旋转事件:

使用旋钮

现在,让我们创建一个简单的实现来测试我们的旋钮。在主要活动中,我们创建一个TextView并将一个视图从容器列表中拖出。显示视图选择后,选择RotaryKnobView。

编辑活动的布局xml文件,并设置最小值,最大值和初始值以及要使用的可绘制对象。

最后,在我们的MainActivity类中,为布局充气并实现RotaryKnobListener接口以更新TextField的值。

到这里已经完成了,为儿子创建一个应用我把初一的数学拿出来了,钢琴考试再不过我绝对会好好“疼爱”你的。返回搜狐,查看更多

责任编辑:

Android钢琴滑动代码,如何使用Kotlin构建Android旋转旋钮以帮助儿子练习钢琴相关推荐

  1. 如何使用Kotlin构建Android旋转旋钮以帮助儿子练习钢琴

    When my son's piano teacher told him he should use a metronome to practice timing, I took it as an o ...

  2. Android钢琴滑动代码,真正完美的android钢琴软件

    8年前 (2013-03-18) | 33,859 views | 35 条评论 | 本文共949个字 现在手机钢琴软件已经相当多了,命名也是一个比一个牛,不过要想满足我的需求,那可真的是比登天还难, ...

  3. Kotlin转向谷歌云平台,因此开发人员可以像在Android上一样喜欢它。Kotlin是Android开发者的宠儿语言。...

    image [中文翻译在后面] Android developers love Kotlin. Google can tell us that 27% of the top 1,000 Android ...

  4. Android钢琴滑动代码,Android实现简易版弹钢琴效果

    本文实例为大家分享了Android实现弹钢琴效果展示的具体代码,供大家参考,具体内容如下 目标效果: 1.drawable下新建button_selector.xml页面: 2.drawable下新建 ...

  5. Android钢琴滑动代码,android 钢琴界面实现

    近在做一个钢琴的东西,关于这个界面如何设计画了很长时间,主要是考虑到针对不同的分辨率,如果只针对一种分辨率的话用绝对布局可以实现,实现的基本思想是每个白色的键的位置是可以计算出来的,屏幕的宽度可以获得 ...

  6. android强制缓存写磁盘,优雅的构建 Android 项目之磁盘缓存(DiskLruCache)

    Android 的缓存技术 一个优秀的应用首先它的用户体验是优秀的,在 Android 应用中恰当的使用缓存技术不仅可以缓解服务器压力还可以优化用户的使用体验,减少用户流量的使用.在 Android ...

  7. android应用商店代码,仿小米应用商店Android客户端

    前言 项目Github地址:https://github.com/LXD312569496/XiaoMiDemo 仿小米应用商店的实现,目前完成界面显示和基本功能的开发,代码一般般,后面会继续完善代码 ...

  8. 《Android Studio实战 快速、高效地构建Android应用》--二、在Android Studio中编程

    代码折叠 Ctrl+数字加号展开光标处已折叠代码块 Ctrl+数字减号折叠光标处已展开代码块 Ctrl+Shift+数字加号展开窗口中全部代码 Ctrl+Shift+数字减号折叠窗口中全部代码 注释代 ...

  9. android sqlite用户注册代码,用户名和密码登录android登录sqlite

    我正在工作sqlite.i成功创建数据库和table.and我也可以注册一些新用户 . 我也用户名写入登录功能只是这是我的代码的一部分 public String getSinlgeEntry(Str ...

  10. android新年祝福代码,讯飞输入法发布Android新春版 Biu一下敲出美好祝愿!

    原标题:讯飞输入法发布Android新春版 Biu一下敲出美好祝愿! 挥别难忘的2018,讯飞输入法与小伙伴们携手迎接"猪"事顺利的新一年.Boys and 朋友们.Ladies ...

最新文章

  1. BDD100K:最经典大规模、多样化的自动驾驶视频数据集
  2. ASIC与FPGA能达到的频率差异巨大是为什么
  3. Windows Phone 7 开发 31 日谈——第6日:工具栏
  4. 关联查询一张小表。对性能有影响吗(mysql)
  5. SVM-支持向量机(code实现)
  6. 【2017-04-16】抽象类、接口、构造函数、重载和重写的区别、静态成员和方法
  7. mysql无法授权问题
  8. 贪心【CF1029E】Tree with Small Distances
  9. Protel 99se汉化步骤
  10. 旋风加速安卓Android官网,旋风加速官网版最新版
  11. Unity创建游戏物体的三种方法
  12. L1-049 天梯赛座位分配 (Python)
  13. Python 常用写法
  14. 虚拟信用卡最大的发行商有哪些?
  15. xarray的DataArray查看nan数量
  16. 新零售餐饮风口正盛,食云集却在夹缝中求生?
  17. 《无懈可击的Web设计》_灵活的文字
  18. [译] TypeScript 3.0: unknown 类型
  19. QT QWebEngineView+UEditor富文本编辑器
  20. 易基因|m6A去甲基化酶ALKBH5通过降低PHF20 mRNA甲基化抑制结直肠癌进展 | 肿瘤研究

热门文章

  1. [iOS URL Schemes相关] URL Schemes 转载
  2. 历史二—— 浮点运算与数组下标寻址
  3. asterisk android代码,Asterisk + Vtiger CRM 5.1 电击拨号 实现来电弹屏
  4. js调用html打印去掉页眉页脚,js 客户端打印html 并且去掉页眉、页脚的实例
  5. markdown在线编辑器
  6. 永洪科技怎么样_【永洪科技工资|永洪科技待遇怎么样】-看准网
  7. 中国工程院院士倪光南:大数据产业安全和发展需同步
  8. utility/u8g.h: No such file or directory -- 0.96寸 不能显示中文 错误
  9. html b5纸尺寸,b5纸的大小?
  10. HTTP Basic Auth:使用和Postman 测试