本文作者
作者:bauerbao
链接:
https://www.jianshu.com/p/2d30934229e9
本文由作者授权发布。
看到作者这篇文章,有种使用ViewDragHelper的感觉,封装思路还是非常值得学习的!
1 概述
目前的app的动画效果是越来越炫了,很多主流app的图片预览返回都有类似功能,比较常见的是ios自带相册,微信朋友圈等等。自己项目中也有类似功能,最近整理了一下这个功能的代码,做个笔记记录,有兴趣的朋友可以点击源码。
https://github.com/bauer-bao/DragCloseHelper
网上已经有对应功能的三方库了,MyDragPhotoView 和 DragPhotoView等等。
https://github.com/MrBoudar/MyDragPhotoView
https://github.com/githubwing/DragPhotoView
但是他们都是继承view去实现的。如果我想用到其他View/ViewGroup上,就不是很方便,需要重新自定义view,然后复制黏贴和修改。因此就有了这篇文章,这个效果可以加在任意View或者ViewGroup上。
效果图:
一般经常用到这个功能的,莫非就是图片预览和视频预览了。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SMkNWNyYDOxgjY5M2MzM2YlVDO5cTMhFjM1cTNjBjZh9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.gif)
视频控件效果
图片控件效果
2 使用步骤
1.activity主题设为透明
2.初始化
3.如果是共享元素启动的页面,需要如下设置(强烈建议和共享元素一起使用,否则是没有灵魂的)
4.设置需要进行拖拽的View/ViewGroup,以及背景ViewGroup(必须要设置背景色)
5.设置监听
6.处理touch事件
7.可以自定义最大拖拽距离和最小缩放尺寸
setMaxExitY(int maxExitY)
setMinScale(@FloatRange(from = 0.1f, to = 1.0f) float minScale)
3原理
很简单,就是touch事件传递,相信大家都已经滚瓜烂熟了。
大概步骤:
1.检测是否有拦截
2.ACTION_DOWN事件,初始化数据
3.ACTION_MOVE事件,如果多手指或者手指Id不一致,则复原,否则开始移动,同时更新拖拽View/ViewGroup的位置和大小。
4.ACTION_UP事件,判断是否超过指定的最大距离,如果超过,开始关闭动画,否则开始复原动画
核心代码如下:
源码:
https://github.com/bauer-bao/DragCloseHelper
参考资料
https://github.com/MrBoudar/MyDragPhotoView
推荐阅读:
Flutter豆瓣客户端(仿),诚心开源
Android 你可能错过的信息 | 2 期
送个学习Android的技巧给你!
扫一扫 关注我的公众号
如果你想要跟大家分享你的文章,欢迎投稿~
┏(^0^)┛明天见!