三微授渔如何使用Kotlin构建Android旋转旋钮以帮助儿子练习钢琴( 二 )
接下来 , 我们初始化组件:
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提供一个接口 , 以监听旋转事件:
推荐阅读
- 传奇英雄▲荒野乱斗:最值得培养的传奇英雄,微氪玩家如何选择?
- 【】财鑫闻丨两市成交量连续2日破万亿,牛市真的来了?下一步如何擒“牛”?
- 精选泛科技|结果如何?,一加8续航遭质疑:上半年最全机型横评出炉
- 健康干货桶|重症肝病患者可否活动?如何掌握?
- 精选泛科技一加8续航遭质疑:上半年最全机型横评出炉,结果如何?
- 「孙权」孙策逝世后,弟弟孙权是如何对待20岁嫂子大桥的?说出来别不信
- 科学家■如果宇宙由奇点大爆炸而来,那么奇点又是如何来的?
- 娱娱乐道|厚嘴唇加大饼脸,网友:她是如何火的?,杨超越大量旧照曝光
- “健康北京”微信公众号|新型冠状病毒肺炎确诊病例如何分型?北京中医医院院长解答
- 央视网|上直播、转内销……外贸企业如何突围?
