RoundMenuView一一自定义扇形菜单控件

2017/05/30 15:30
阅读数 86

使用方式

开始绘制(分2种情况,触摸|未触摸)

①:未触摸显示解刨

展示的图形分为4个模块,标签层rectFLabl、绘制bmp的rectF、白金层rectFGold(因为不会拼写银这个单词白金高大上啊),对应不同的半径如上图所示。代码中rectF 表示未触摸层,rectFF表示触摸弹出层,下面会讲解。

②:绘制 

xfermode详情跳转

http://blog.csdn.net/harvic880925/article/details/51264653

③:触摸touch显示解刨

与触摸层有点类似,标签层改为阴影部分,原本绘制bmp区域现在绘制文字。不过所有的半径变大。绘制的方法和上面的神似,这里就不举栗说出了。

④:开始绘制文字

绘制文字和bmp首先要先复习一下数学公式。再此我希望我的数学老师们都把学费还给我,毕竟我知识也还给你们了啊。

x=Math.sin(2∗PI/360∗angle)∗r

y=Math.cos(2∗PI/360∗angle)∗r

上面公式中,2*PI/360*angle,即求angle的弧度。

Math.sin(x) x 的正玄值。返回值在 -1.0 到 1.0 之间;

Math.cos(x) x 的余弦值。返回的是 -1.0 到 1.0 之间的数;

这两个函数中的X 都是指的“弧度”而非“角度”,而我们可以用 Math.toRadians(angle)求出当前的弧度,所以最终我们可以用 
 x=Math.sin(Math.toRadians(angle))∗r 来获取当前角度对应的半径所在的的x轴坐标,y轴亦可。

 

我们先绘制文字,如上图的9个文字。“不辣,川菜一点都不辣” :

绘制文字 和 绘制模块RECTF 有一点区别,模块是一个角度一个角度绘制,为了用户体验。但是绘制文字选择的是根据 animatedValue(从0到最大显示角度所返回的animation.getAnimatedValue值) 的角度去处理不同区域的文字。

举个栗子:如果当前有3个模块共180°,那么 animatedValue==60° 的时候我们绘制第一个模块的文字, animatedValue<120度 的时候我们还是绘制第一个模块的文字。

⑤:绘制bitmap

绘制之前首先我们要得到 bitmap 最大width/height,再获取 bitmap 中心点。获取中心点上面的栗子已经有说明了,那么我们现在着重获取 bitmap 的最大宽高。然后得到两者的较小值即可设定为 bitmap 区域。

灵魂画家。。。

⑥:绘制原点旋转的bitmap

我们将bitmap挪动到屏幕中心点,即bitmap中心点==绘制中心点。再根据当前animatedValue的角度进行旋转。

了解更多的matrix

http://www.gcssloop.com/customview/Matrix_Basic

OnTouch处理

首先,我们绘图 onDraw() 的时候将画板canvas移动到中心点,所以我们这样处理坐标点

float x = event.getX() - (mWidth / 2);

float y = event.getY()- (mHeight / 2); 

第二步我们要求出触摸的角度,因为Android里面坐标系与我们数学上的不同,android由第4 - 3 - 2 -1 象限开始绘制角度。

获取角度的方法:Math.toDegrees(Math.atan(y/x));

但是当 x<0 的时候,,求出的角度实为 [0°,-90°) ,此时我们给它掰正。当 x<0,角度就+180°。

求出触摸的角度之后我们再算出触摸的半径,这样子就可以判断当前是否触摸到了我们所绘制的各个模块上。

另外,老大对 onTouch 触摸的时候有个提议,那就是触摸中心bmp菜单之后不松手(此时 animator显示),然后滑动屏幕选择对应的模块后松手,一气呵成。也就是 一个ACTION_DOWN 和 一个ACTION_UP,中间 N个ACTION_MOVE,这没关系,有需求我们就去做是吧。

没关系,我们在当前Activity做一下处理,在move和up事件中不处理,传给我们自定义view,传入的event.getRawX() - pieLocation[0]就可以视为是在我们MenuChart里面对应的坐标点了。[可以试一下点击小二,来份菜单btn的时候手指不松开移动到展示开的模块。]

结束语

因为毕竟新手上路,所以可能会存在某些问题,不过感言应该就是动手写东西的确比想象中的难,不积跬步无以至千里。有什么不正确的地方,希望大家指正。

项目地址:

https://github.com/qdxxxx/MenuChart

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部