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

还是先上效果图

这里写图片描述

功能:
点击中间按钮可以展开和收缩
使用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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值