转载

猎豹 “快切 App” 中用到的 Android 开发技巧探索

本文由 顾明伟 投稿。

顾明伟 的博客地址:

http://blog.csdn.net/u013045971

不管是效果,还是包含的知识点都是非常丰富的,源码也已经开源,非常值得学习。

1

前景提要

  • 什么是 快切

快切是从猎豹的Clear Master中分离出来的一个悬浮窗小工具。因为对这个比较感兴趣,博主断断续续花了2个月时间完成了一个类似块切的版本,起了个名字叫“Well Swipe”,中文名叫“Well 划划”。本文会针对Well 划划开发中遇到的一些坑和和技巧做一个分享。来给大家揭密块切开发过程中用到的自定义控件技术细节。在这里还有一个叫“单手划划”的app不得不说,也做的很好。

  • 快切 长啥样子?

猎豹 “快切 App” 中用到的 Android 开发技巧探索

问题:

  1. 如何触发菜单

  2. 如何通过手势控制菜单的旋转,打开,关闭

  3. 旋转的过程中如何做到item循环展示

  4. 拖动item效果

  5. 拖动item时的排序效果

  6. item的过渡动画(删除一个item之后,剩余的item会自动平移到目标位置。拖动排序时item自动平移到排序之后的位置)

  7. 控件之间如何交互(旋转菜单的时候指示器跟着转,拖动的时候角落菜单变化状态,拖动到垃圾箱)

  8. 重写的onItemClick,onItemLongClick事件

带着上述问题开始我们对Well 划划的探索之旅。

2

如何触发菜单

在设备处于桌面或者其他app的情况下,从屏幕地步往外划来触发菜单。这个真没有别的办法,只能用WindowManager。因为你第三方app不可能拿到桌面或者任何其他app的事件来触发你自己的app。我的做法是在屏幕地步画了6个矩形。一边3个,拼接出来两个L型的区域,不多不少刚刚够用,再在设置里加上调整大小的自定义功能。块切单手划划都是这么搞的。

3

如何通过手势控制菜单的旋转,打开,关闭

打开: 打开这个手势在底部L型的触发区域进行。设计的时候分左右。所以写的时候也要分左右,当手指划过一定距离之后就开始打开菜单,手指这个时候还没停,手指继续滑动的时候计算一个0-1的值用来控制菜单从小到大展开的效果。我设计了这样的一个接口,把需要的scale值回传到菜单view来使用

猎豹 “快切 App” 中用到的 Android 开发技巧探索

滑动的过程中持续不断的回传一个scale值。

猎豹 “快切 App” 中用到的 Android 开发技巧探索

旋转: 菜单打开之后,介个时候,手指在菜单的父容器中滑动,回传一个角度值,角度值通过三角函数就可以获得到,菜单跟着旋转。旋转的处理要考虑菜单的打开方式是左边还是右边。后面还加了一个功能,手指往角落方向滑动时关闭菜单,所以还要处理华东时的角度问题。在滑动的过程中回传角度值angle来旋转菜单,松开手指后自动转到目标角度。

猎豹 “快切 App” 中用到的 Android 开发技巧探索

关闭 :关闭有点击菜单外时,点击角落X时,往角落滑动手指时分别都可以关闭菜单

1).点击角落XX按钮域时

@Override  
public void cornerEvent() {  
    if (mEditState == STATE_EDIT) {  
        setEditState(AngleLayout.STATE_NORMAL);  
        return;  
    }  
    if (mEditState == STATE_NORMAL) {  
        off();//点击外部空白区域的时候关闭  
    }  
}  

2).点击外部区域

猎豹 “快切 App” 中用到的 Android 开发技巧探索

3).快速滑动结束后

if (MOVE_TYPE == TYPE_OFF && upTime - mLastTime < 400) {  
     off();  
}  

4

旋转的过程中如何做到item循环展示

如何做好循环展示?很简单,每次转90度之后刷新界面,把item重新排序。如

初始值是1  2  3:

第一次旋转后 2  3  1

第二次旋转后 3  1  2

第三次旋转后 1  2  3

这时又回到了原位,每四次是一个循环,这样规律久很容易总结出来了。

当前的数据索引index, 上一组的索引, 下一组索引:

猎豹 “快切 App” 中用到的 Android 开发技巧探索

求出因该取那一组数据之后,还要求出哪个限象,即,把第X组数据放在第Y限象。然后一只重复起来就造成了循环的感觉。

当前限象currentQua, 上一个限象preQua, 下一个限象nextQua代码为:

猎豹 “快切 App” 中用到的 Android 开发技巧探索

最后拿求得的数据喝限象来布局item

布局子item的位置

猎豹 “快切 App” 中用到的 Android 开发技巧探索

5

拖动item效果

拖动Item这个其实也没啥难的,就是长按的时候根据按下的位置和item布局的时候求得位置来得到一个Item的对象,拿到item的数据,在父容器中创建一个view跟着手指移动就可以了。有人就问了,直接onItemLongClick不就可以了,为啥还要求啊,这个还真是要求的,控件角度发生变化后的onClick,onItem等事件触发是有问题的,因为画布发生了变化,点击能找到子Item,但是找的不对,item已经转走了,事件还可以触发,这样就不合适了不是,所以我们要重写一系列事件。

拖拽的时候传递item的数据信息,包括视图view,坐标信息,offsetLeft,offsetTop

猎豹 “快切 App” 中用到的 Android 开发技巧探索

6

拖动item时的排序效果及过度动画

删除一个item之后,剩余的item会自动平移到目标位置。拖动排序时item自动平移到排序之后的位置,不管是删除还是排序,基本上就是数据发生变化之后再做视图View变换效果的过程,计算位置的算法即全面已经写好的,在这里取掉限象的计算就可以使用了。

例如:123456  这几个数据初始化完成之后会有一个自身的位置。然后把位置信息保存在一个list中。

比如现在删除掉3,就剩下12456,这时候快速的用位置计算算法再算出只有5个item时的新的一个位置信息list,计算完成后遍历12456,遍历平移对应的位置信息(这里用属性动画就可以),位置没有发生变化的就不会动,位置信息变化的就有平移效果。

位置平移在排序和删除的时候的应用时一样的。

平移动画

猎豹 “快切 App” 中用到的 Android 开发技巧探索

交换动画

猎豹 “快切 App” 中用到的 Android 开发技巧探索

7

控件之间如何交互

AngleView  菜单                                    (关键代码近2000行)

AngleLayout 菜单容器

AngleViewTheme 菜单主题

AngleIndicatorView 菜单指示器

AnglrIndicatorTheme 菜单指示器主题

CornerView 角落控制按钮

CornerThemeView 角落控制按钮主题

LoadingView 进度条

各个控件都定义了接口和其他接口进行值的传递和交互

8

重写的onItemClick,onItemLongClick事件

为什么要重写onClick,onItemClick,onItemLongClick呢?原生的好好的为什么不用?

这个问题其实前面已经给出了答案,当控件的画布发生变化之后,这些“on事件”是可以触发的,但是看不到实际的item控件,因为这些控件已经跟着画布转走了,再使用肯定不是办法,所以要重写,重写的时候根据子item布局时候的位置加上onTouch的位置信息即可计算出来点击的是哪个item。所以自定义这些"on事件"也不是什么难事。

源码下载:

  • https://github.com/gumingwei/WellSwipe

掘金是一个高质量的技术社区,从 RxJava 到 React Native,性能优化到优秀开源库,让你不错过 Android 开发的每一个技术干货。长按图片二维码识别或者各大应用市场搜索「掘金」,技术干货尽在掌握中。

猎豹 “快切 App” 中用到的 Android 开发技巧探索

如果你有好的文章想和大家分享,欢迎投稿,直接向我投递 文章链接 即可。

欢迎 长按下图 -> 识别图中二维码 或者 扫一扫 关注我的公众号:

猎豹 “快切 App” 中用到的 Android 开发技巧探索

原文  http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820890&idx=1&sn=112b88c31bffcdf22531878222ebea8d&scene=0
正文到此结束
Loading...