旋转列表菜单,支持收缩,
2016-06-07 14:18
369 查看
还是先上效果图
功能:
点击中间按钮可以展开和收缩
使用adapter配置菜单,易扩展
可以定义排列的角度范围,例如从0排列到180度,范围内排列个数
启用了简单的复用
基本实现原理
继承FramneLayout,所有子项围绕中心沿一定角度分布,根据角度值算出他们的位置。只在一定角度范围内展示,超出范围的用一个圆环View来挡住.
根据手指移动,决定滑动的角度,实时更新View位置,并决定是否添加和移除View。
可以像listView那样滑动,滑出的部分View移除出去,滑进来的View动态添加。
自定义属性配置:
可以不配置,都有默认值
控件写的很不完美。
/**需要用一个遮挡环来挡住超出区域的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。
功能:
点击中间按钮可以展开和收缩
使用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。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories