Android仿酷狗旋转界面功能-自定义控件实现

引言

该旋转界面主要是仿照IOS酷狗版的旋转界面来实现,本项目通过结合ValueAnimator、Rotation、PivotX和PivotY来实现,目前主要实现了左旋转和右旋转,该功能主要是在我的乐乐音乐播放器里面使用,其项目地址如下:https://github.com/zhangliangming/HappyPlayer5.git

需求

  • 在界面上左右滑,View的角度根据手势移动。
  • 只拦截左右滑动,上下方向的滑动无影响。
  • 子View的左右滑动事件无影响。

预览图

image

实现思路

  • RotateLayout:左右旋转View
  • onInterceptTouchEvent:该方法只要做左右移动拦截,上下移动不拦截。
  • ValueAnimator:该动画只要改变RotateLayout View的角度位置,在ACTION_UP和界面打开时调用。
  • ACTION_MOVE时,根据移动的X位移,修改RotateLayout的角度。
  • 角度算法:先确定旋转view的旋转中心为Q(width/2,height*1.5),然后根据第一次触摸时,该触摸点在屏幕上面的AXY(ax,ay)坐标,根据A点和Q点,计算出该次的夹角A。滑动时,同理计算滑动时的BXY(bx,by)坐标,计算出B点和Q点的夹角B,通过B - A,可以得出view的旋转度数。计算夹角时,可以使用tan来计算,如果计算出来的夹角为负数时,需要+180来得到真正的夹角。
  • 注意,需要activity开启硬件加速,动画才流畅。

主要代码分析

onFinishInflate

360截图20180213200906771.png

该方法只要实现两种方式,一种是通过布局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当前的角度,如果小于关闭窗口的标志值,则角度还原0.否则关闭view.

源码

具体的代码和调用Demo,可到源码地址处查看:
https://github.com/zhangliangming/RotateLayout.git

最后

如果有问题,可到github上面留言。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,081评论 25 709
  • 什么是View View 是 Android 中所有控件的基类。 View的位置参数 View 的位置由它的四个顶...
    acc8226阅读 1,240评论 0 7
  • 一开始便把你要讲的主题以实例的形式告诉听众,通过这个例子,生动地说明你希望传达给听众的意念是什么。接着则以详细清晰...
    猫小哚阅读 139评论 0 0
  • 晚上翻阅了王小波的文章,是前两周在图书馆借来的书。自从四五年前听说他的名字,今天还是第一次真正意义上的认识。 读了...
    更向远行阅读 211评论 0 0
  • 我即将大三,每当想到这一点,我就心痛的要死了。我用人生最美好的十几年披荆斩棘换来的四年,就这样过去了一半。 高考后...
    一起谈天说地阅读 474评论 14 8