登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

楼主: Emotion_sk

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

[复制链接]

37

主题

66

帖子

979

安币

代码手工艺人

Rank: 4

QQ达人

发表于 2018-2-13 20:35:01 | 显示全部楼层 |阅读模式
如果对本篇文章感兴趣,请前往,原文地址:http://www.apkbus.com/blog-278062-77073.html

# 引言 #该旋转界面主要是仿照IOS酷狗版的旋转界面来实现,本项目通过结合ValueAnimator、Rotation、PivotX和PivotY来实现,目前主要实现了左旋转和右旋转,该功能主要是在我的乐乐音乐播放器里面使用,其项目地址如下:[https://github.com/zhangliangming/HappyPlayer5.git](https://github.com/zhangliangming/HappyPlayer5.git "乐乐音乐播放器") 。# 需求 #- 在界面上左右滑,View的角度根据手势移动。- 只拦截左右滑动,上下方向的滑动无影响。- 子View的左右滑动事件无影响。# 预览图 #![image](http://upload-images.jianshu.io/upload_images/4111431-dd68394a11a1d84f?imageMogr2/auto-orient/strip|imageView2/2/w/1240)# 实现思路 #- 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](http://upload-images.jianshu.io/upload_images/4111431-63be7725fd3ea68b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)该方法只要实现两种方式,一种是通过布局xml文件来初始化RotateLayout;另外一种是新new RotateLayout。## onLayout ##![360截图20180213201016587.png](http://upload-images.jianshu.io/upload_images/4111431-f909bcd66d77a595.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)![360截图20180213201029936.png](http://upload-images.jianshu.io/upload_images/4111431-b8d20490cf28393c.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)该方法只要是在初始化成功之后,修改RotateLayout的角度。## onInterceptTouchEvent ##![360截图20180213201201541.png](http://upload-images.jianshu.io/upload_images/4111431-03ddcea889154b57.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)![360截图20180213201300429.png](http://upload-images.jianshu.io/upload_images/4111431-8249ed1d37c9e32b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)该方法只要是拦截左右移动和判断是否在左右不拦截的子View集合里面。## onTouchEvent ##![360截图20180213201300429.png](http://upload-images.jianshu.io/upload_images/4111431-e2bf431c78e25f93.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)该方法只要在用户左右移动的时候,修改RotateLayout的角度。![360截图20180213201437316.png](http://upload-images.jianshu.io/upload_images/4111431-59d0ce4971049511.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)该方法只要是ACTION_UP的时候,需要判断当前RotateLayout当前的角度,如果小于关闭窗口的标志值,则角度还原0.否则关闭view.# 源码 #具体的代码和调用Demo,可到源码地址处查看:[https://github.com/zhangliangming/RotateLayout.git](https://github.com/zhangliangming/RotateLayout.git "Android仿酷狗旋转界面功能")# 最后 #如果有问题,可到github上面留言。  继续阅读全文



想在安卓巴士找到更多优质博文,可移步博客区

如果对本篇文章感兴趣,请前往,
原文地址:
http://www.apkbus.com/blog-278062-77073.html
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表