您的位置:首页 > 移动开发 > Android开发

旋转列表菜单,支持收缩,

2016-06-07 14:18 369 查看
还是先上效果图



功能:

点击中间按钮可以展开和收缩

使用adapter配置菜单,易扩展

可以定义排列的角度范围,例如从0排列到180度,范围内排列个数

启用了简单的复用

基本实现原理

继承FramneLayout,所有子项围绕中心沿一定角度分布,根据角度值算出他们的位置。只在一定角度范围内展示,超出范围的用一个圆环View来挡住.

根据手指移动,决定滑动的角度,实时更新View位置,并决定是否添加和移除View。

可以像listView那样滑动,滑出的部分View移除出去,滑进来的View动态添加。

自定义属性配置:

可以不配置,都有默认值

<declare-styleable name="ringMenu">
<attr name="range" format="dimension" /> 半径
<attr name="centerX" format="dimension" />
<attr name="centerY" format="dimension" />
<attr name="numColume" format="integer" /> 范围内排列个数
<attr name="fromAngle" format="integer"></attr> 起始角度
<attr name="toAngle" format="integer"></attr>  终点角度
<attr name="drawRing" format="boolean"></attr> 是否画遮挡圆环
<attr name="itemWidth" format="dimension"></attr>
<attr name="itemHeight" format="dimension"></attr>
<attr name="ringColor" format="color"></attr>  用来遮挡的空心扇形(部分圆环)颜色
<attr name="ringStartAngle" format="integer"></attr> 空心扇形起始
<attr name="ringSweepAngle" format="integer"></attr> 空心扇形终点
<attr name="menuSize" format="dimension"></attr> 中心按钮大小
<attr name="centerButtonBackgroud" format="reference"></attr> 中心按钮背景
</declare-styleable>


控件写的很不完美。

/**需要用一个遮挡环来挡住超出区域的View,而不能用画笔擦除的方式,我试验了很多种paint..setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

用这种方式来擦掉超出部分,都不理想。*/

get到一个新知识,viewgroup绘制子项,是在dispatchDraw中进行,修改了代码可以直接擦除子view已经绘制的视图..

为了限制子项在一定角度内,看起来像是一个拐弯的listview,drawRing的含义变成是否限制子项,默认是限制的

ringStartAngle,ringSweepAngle 擦除区域的角度分布

ringColor 没有作用了

擦除区域也可以不用理会,不用去想应该擦除哪个角度,直接drawRing设为false,调好控件的位置就行了.

控件实际大小比上面例子看到的要大

想想360度都有View围绕的大小。如果想想上面例子一样位于底部,则需要用marginRight和marginBottom负值来控制,把一些多余空间丢在外面,并且调效角度范围。

总个数不足设置的“范围内排列个数”的话,会均匀分布,不能滑动。

需要画滑动的轨道之类的可以在这个的下层添加View画。

RotatoMenu下载地址

https://git.oschina.net/dxtx100/RotatoMenu.git

仅RotatoMenu类和atrrs.xml就可以使用了,其他事demo例子,文件比较简单,就丢进去没建立完整demo。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息