Compose 实现微信朋友圈大图查看

要实现这么一个需求,首先我们得知道compose的动画是怎么样玩的,因为从点击朋友圈到大图界面其实是由平移,缩放,背景渐变这三个动画同时作用完成的。然后还得知道compose的事件是怎么处理的,大图界面有pager的水平滚动,还有双击,单击,双指操作单指操作,和上下拖拽隐藏界面。

进入和退出大图界面动画实现

首先得知道朋友圈的小滑稽图片在parent的相对坐标点,因为要使用平移动画,首先得知道平移的起始点吧?

使用onGloballyPositioned 函数就行了

获取到的坐标先保存到rect变量里面,然后显示的时候把整个图片list 和 位置以及rect 传进去并执行动画。

imageViewerState 是自己定义的一个状态类,用于保存大图查看界面的一些状态,使用state注解标记可以减少一些不必要的重组。

其中curPosition 表示当前是第几张图片,srcRec 表示原图片的坐标rect 信息,show用来控制大图界面的显示。剩下其他的就是一些动画相关的参数。

点击图片会调用show方法,show方法主要就是执行动画。

大图界面根据动画的百分比percent来做出一系列UI的改变。比如背景渐变和平移的变化,如下

从大图界面返回的时候要注意透明度的变化不是从1->0 ,而是从拖拽之后的透明度->0。

缩放大小改变使用size方法来处理。

进入的时候从src 的大小->整个界面的大小,退出则反着来。

我们再来看下大图查看界面的事件是怎么处理的,大图查看界面的事件还是比较复杂的。

大图查看界面事件处理

微信的大图查看,双指只能放大缩小图片,单指向下能拖拽图片并且到达一定距离便可退出大图界面。

图片没有缩放的情况左右滑动才可以切换图片,单击退出大图界面,双击放大图片,放大状态双击返回图片原来的大小。

别慌,我们一 一来实现。

首先实现比较简单的点击或者双击,用compose 提供的detectTapGestures 就行了

这个函数,原理是怎么样的?

可以看到超过400毫秒就判定为长按了。

长按事件其实是通过协程的取消机制来做的,超过400ms 后超时会自动触发协程的cancel,然后会进入异常catch块触发长按事件。如果没超过,在400ms内再来了一次事件就会触发双击事件,如果400ms内只来了一次事件就会触发单击事件。

源码分析到这里,好了开始干正事,我们来实现双指操作。

可以通过changes 来判断当前有几根手指头按下,如果为2就是双指了,然后通过compose 提供的calculateZoom 方法就可以知道双指操作放大或缩小的值了。

再来看下怎么处理拖拽并退出大图界面

当在y上移动的增量大于x移动的增量的2倍,并且大于touchSlop ,表示我们就要消费事件执行下拉拖拽隐藏界面了。up时,当在y轴拖动正向距离超过100dp隐藏界面,否则回到原来的位置。

相关推荐
xiangpanf10 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx13 小时前
安卓线程相关
android
消失的旧时光-194313 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon14 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon14 小时前
VSYNC 信号完整流程2
android
dalancon14 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户693717500138415 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android16 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才16 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶17 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle