此博客作为技术记录用,希望能帮助到需要的人。
安卓recyclerview嵌套webview造成的滑动冲突
最近在做一个智能客服的项目,整个聊天内容是一个recyclerview,里面每一条信息都是一个item,不同类型的回复对应不同的viewholder,其中有一个item的布局中有一个webview,该webview加载的h5页面的实际长度超过了手机屏幕的宽度,所以需要能够左右滑动,但是用户实际滑动过程中不可能完全水平滑动,更多是小角度的斜着滑。
如果你了解view的事件分发机制和滑动的原理,就能预见到斜着滑动会导致这个webview在水平方向滑动会特别生硬且伴随着上下抖动。这是由于view滑动的原理是在一段时间内不断的调用draw方法重新绘制view,每次绘制之间的时间间隔很短,这样就实现了平滑的滑动效果(原理类似动画的制作)。
至于view的事件分发可以看看郭神的博客
Android事件分发机制完全解析,带你从源码的角度彻底理解(上).
此处我是使用了一个相对布局作为一个webviewcontainer,通过设置其背景图片来设置聊天信息的背景图(类似qq)。
此问题的解决办法是:重写这个相对布局,并重写它的ontouchevent方法,在方法中计算出用户滑动的方向和水平方向的夹角,如果超过60°,就判定为用户想上下滑动,就调用requestDisallowInterceptTouchEvent方法来干预其父控件recyclerview的intercptouchevent方法,让它拦截这个事件并处理;如果小于60°,就认为用户想左右滑动,即不让recyclerview拦截该事件。代码如下:
public class AiRelativeLayout extends RelativeLayout {
public float oldY;
public float oldX;
public float newY;
public float newX;
public AiRelativeLayout (Context context){
super(context);</