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隐藏界面,否则回到原来的位置。

相关推荐
雨白2 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹3 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空5 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭5 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日6 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安6 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑6 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟11 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡12 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi0012 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体