这是我中期考核的作品,时隔半年,迎来这一次的重构。重写知乎日报的webview滑动逻辑,以及美化UI,同时对主页进行了compose重构,用户可以通过个人页点击按钮切换(点击头像跳转)
下面我来说一下本次重构的新颖点和难点
在知乎日报的WebView页,我们可以发现它是以类似翻页的操作实现的,但是**「知晤晨笺」**对于滑动的处理不一样,它始终是一个Activity没有fragment,它通过检测左右滑动来判断页面是否需要刷新,它的数据源由一个变量
储存
private val stories = mutableListOf<Story>()我们知道,对于WebView其页面内部也会有滑动,并且如果为我们识别左右滑动更新WebView的url时还可能会遇到这样的问题,对于全面屏手势,左右边缘的滑动即侧滑对应系统层面的手势返回,这会被Webview消费掉,导致WebView的网页回退(在WebView没有历史记录,即第一个网页时,才能手势退出界面)
所以这里解决了3种条件下的滑动冲突
1.WebView拦截 vs. 系统侧滑返回(最高优先级冲突)
引入 edgeThreshold (40dp)即边缘宽度,在这个边缘WebView不会拦截滑动并消费事件
2.Web 垂直滚动 vs. 自定义横向翻页(维度识别冲突)
引入“动态斜率判定” (abs(deltaX) > abs(deltaY) * 1.6),当用户有明显的翻页意图再执行翻页操作
3.WebView 内部元素点击/横向滚动 vs. 自定义翻页(组件功能冲突)
如果网页内部有横向滑动的图片轮播或者用户只是想点击一个链接,自定义的翻页逻辑可能会拦截这些事件。
通过 isSwipingHorizontally 状态位和事件消费机制处理。
compose页面重构中,对于主页的滑动刷新逻辑,我发现一直往下滑刷新会出现手势划不动的情况。保持一直下滑的手势,多次下滑不停顿,就会一直卡住,明明以及看到下面数据的影子了,但是当你松开手指,过一会,你发现又可以了。这个就是Android12更新的拉伸回弹机制在作祟
去除这个机制后就不卡了


