引言
該旋轉(zhuǎn)界面主要是仿照IOS酷狗版的旋轉(zhuǎn)界面來實現(xiàn),本項目通過結(jié)合ValueAnimator、Rotation、PivotX和PivotY來實現(xiàn),目前主要實現(xiàn)了左旋轉(zhuǎn)和右旋轉(zhuǎn),該功能主要是在我的樂樂音樂播放器里面使用,其項目地址如下:https://github.com/zhangliangming/HappyPlayer5.git 。
需求
- 在界面上左右滑,View的角度根據(jù)手勢移動。
- 只攔截左右滑動,上下方向的滑動無影響。
- 子View的左右滑動事件無影響。
預(yù)覽圖
image
實現(xiàn)思路
- RotateLayout:左右旋轉(zhuǎn)View
- onInterceptTouchEvent:該方法只要做左右移動攔截,上下移動不攔截。
- ValueAnimator:該動畫只要改變RotateLayout View的角度位置,在ACTION_UP和界面打開時調(diào)用。
- ACTION_MOVE時,根據(jù)移動的X位移,修改RotateLayout的角度。
- 角度算法:先確定旋轉(zhuǎn)view的旋轉(zhuǎn)中心為Q(width/2,height*1.5),然后根據(jù)第一次觸摸時,該觸摸點在屏幕上面的AXY(ax,ay)坐標,根據(jù)A點和Q點,計算出該次的夾角A?;瑒訒r,同理計算滑動時的BXY(bx,by)坐標,計算出B點和Q點的夾角B,通過B - A,可以得出view的旋轉(zhuǎn)度數(shù)。計算夾角時,可以使用tan來計算,如果計算出來的夾角為負數(shù)時,需要+180來得到真正的夾角。
- 注意,需要activity開啟硬件加速,動畫才流暢。
主要代碼分析
onFinishInflate

360截圖20180213200906771.png
該方法只要實現(xiàn)兩種方式,一種是通過布局xml文件來初始化RotateLayout;另外一種是新new RotateLayout。
onLayout

360截圖20180213201016587.png

360截圖20180213201029936.png
該方法只要是在初始化成功之后,修改RotateLayout的角度。
onInterceptTouchEvent

360截圖20180213201201541.png

360截圖20180213201300429.png
該方法只要是攔截左右移動和判斷是否在左右不攔截的子View集合里面。
onTouchEvent

360截圖20180213201300429.png
該方法只要在用戶左右移動的時候,修改RotateLayout的角度。

360截圖20180213201437316.png
該方法只要是ACTION_UP的時候,需要判斷當前RotateLayout當前的角度,如果小于關(guān)閉窗口的標志值,則角度還原0.否則關(guān)閉view.
源碼
具體的代碼和調(diào)用Demo,可到源碼地址處查看:
https://github.com/zhangliangming/RotateLayout.git
最后
如果有問題,可到github上面留言。