自定义控件之圆形菜单
layout
如图所示,按钮之间的角度差等于360/按钮数,这里的角度差就是60度。根据几何知识可以算出每个按钮的左上右下坐标
|
|
让菜单动起来
先通过CircleUtil.getAngle()算出手指滑动的两个点之间的角度差angle,再重新计算出按钮的开始角度startAngle += angle;调用requestLayout()方法,让界面重新布局和绘制,就可以让菜单动起来
|
|
CircleUtil,计算触摸点的角度和象限的工具类
所需数据源
|
|
准备条目布局
|
|
在自定义ViewGroup中定义加入子条目信息的方法
|
|
设置数据到布局中
|
|
处理测量操作
|
|
布局条目的位置
|
|
优化圆形菜单
当前圆形菜单的宽高设置对自定义控件效果的影响
先获取MeasureSpec的size和mode,用户在布局文件中定义宽高的情况分为三种,但由于控件是圆的,我们要做如下处理
- 当用户宽高均输入MATCH_PARENT
mode为MeasureSpec.EXACTLY,此时若想要显示为圆形且不超过屏幕,需要取宽度和高度的较小值
- 用户宽高均输入固定值
mode为MeasureSpec.EXACTLY,想要显示为圆形可能超过屏幕,需要取宽度和高度的较小值
- 用户宽高均输入wrap_content,由于无法确定控件宽高,则直接取屏幕宽度和高度的较小值
当圆形菜单的大小确定后,孩子视图的的大小就不能随意由用户设置了,应该和父布局匹配
孩子视图的宽或高均为圆形菜单的宽高的1/4(仅仅是当前需求,实际开发中按开发需求设置)
|
|
圆形菜单的手势旋转
|
|
摩天轮控件
|
|