[原创]本地解决ViewPager和Webview引起的滑动冲突问题

前言:毕业之后在高薪的后厂村互联网公司和生活工作平衡的体制内之间纠结了好久,最后选择了后者,毕竟后厂村只要有技术什么时候都能去,体制内基本上除了应届生这次机会基本上就再也进不去了,社招就算进去也没有编制。基于“面对两难选择时,选择没有体验过的那个”的原则,选择了体制,然后有幸被分配到了移动端开发的部门,以前积累的一点小知识算是没有浪费。负责的这个app每天有几千人用,虽然大家都在吐槽它速度慢,体验差,bug多,适配不友好……但是如果你是他的客户,你是不得不用的,因为……他管钱。

需求:体制内的程序还是以稳定为主,所以技术探索并不像后厂村的大厂一样经常探索。现在一个需求就是解决ViewPager和webview轮播图的滑动问题。看了一些博客我认为由js端传给android端轮播图的位置的解决方案体验最好。但是由于种种原因,上级希望能够android端本地解决。本地解决问题就来了,我怎么知道webview里面的轮播图在哪里?在我目前的知识储备来看,单凭android端是做不到的。

解决方法:所以就想了一个本地的笨方法,把屏幕分割成左中右三份,从手指落地的位置开始算,在两边滑动就滑动ViewPager,在中间滑动就滑动webview轮播图片。

两个思路:一个是给webview添加onTouchListener,使用requestDisallowInterceptTouchEvent()方法告诉ViewPager要不要拦截。太简单,会出现拦截不及时,轮播图还会滑动一点,造成轮播图卡住,不自动轮播,需要手动调整复位才能继续轮播。我认为是js端的问题,但是无法解决。为什么?如果能解决早就可以js端告诉android端轮播图在哪了!

第二个思路就是重写ViewPager的OnInterceptTouchEvent()方法,根据不同的情况对情况进行拦截。

第一步:ACTION_DOWN在两边OnInterceptTouchEvent()返回true,在中间返回false。嗯,这样不会发生轮播图滑动一点的情况了。可是,在两边的都拦截了,那在Fragment里面两边的控件 怎么办,没法点击了,被拦截了。

第二步:所以即使在两边也有不被拦截的情况。目前发现两种,一种是点击,一种是上下滑动。因为一个触摸事件是先一个ACTION_DOWN,后面若干个ACTION_MOVE,最后一个ACTION_UP。这个move只要手指在屏幕上就会一直调用,所以哪怕是点击事件有时也会出现move。因为滑动时间和距离是一直增加的,所以就在move滑动时间和距离大于某个数之后return。经过调试和体验,基本上达到了要求。

无法解决的问题:

如果一个fragment包含多个webview或其他控件,一个webview只包括一个html控件还好。如果一个fragment包含只包含一个大webview,大webview里是一个完整的网页,甚至没有轮播图,那就造成即使在中间滑动也没什么用。这个问题只靠android端我现在还没好的方案,哪个大神有可以赐教。

下面贴出OnIntercepTouchEvent代码

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event){
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downX=event.getX();
                downY=event.getY();
                downTime= System.currentTimeMillis();
                if (downX< ScreenUtil.getScreenWidthPixels(getContext())/5||downX>ScreenUtil.getScreenWidthPixels(getContext())/5*4){
                    isIntercept=true;
                }else {
                    isIntercept=false;
                    return false;
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_MOVE:
                long moveTime= System.currentTimeMillis();
                float moveX=event.getX();
                float moveY=event.getY();
                if (isIntercept&&(Math.abs(moveY-downY)<20)&&((moveTime-downTime>300)||(Math.abs(moveX-downX)>9))){
                    return true;
                }
                if (isIntercept&&(Math.abs(moveY-downY)>=20)){
                    return false;
                }
                break;
        }
        return super.onInterceptTouchEvent(event);
    }

  

时间: 2024-09-28 12:32:21

[原创]本地解决ViewPager和Webview引起的滑动冲突问题的相关文章

安卓解决viewPager和scrollView和listView滑动冲突的问题

大家想想listView的实现方式 就是一个item一个item 添加到一个布局中, 那么LinearLayout可不可以像ListView 那样 往里面添加item  答案是可以的 我们先模拟listView 的LinearLayout类 public class LinearLayoutForListView extends LinearLayout { private ListAdapter adapter; private OnClickListener onClickListener

android 布局 使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题

使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题. 我的问题原型: 这个问题,我相信遇到的人会比较少,我是在 一个 viewPager 中,其中 一个 fragment 中实现了长按滑动图片的功能,而发现它们两者的 onTouchEvent事件冲突. 尝试过的解决方法: 1----- 遇到这问题,首先是百度,百度到的方法有,自定义 viewPager,在里面重写    onTouchEvent  和 onInterceptTouchEvent,具体代码是下面,这种方法,我尝

解决侧滑中ViewPager和SlidingMenu的滑动冲突

当我们在使用开源框架SlidingMenu时,如果要是使用到ViewPager,就会出现滑动冲突. 解决方案: }/** 解决ViewPager和侧滑冲突 */ public void changeSlidingMenuTOUCHMODE(int arg0) { switch (arg0) { case 0: if (getActivity() instanceof SlidingFragmentActivity) { SlidingFragmentActivity activity = (Sl

解决TextView多行滑动与NestedScrollView等,滑动冲突,我的解决方案

1.首先要明白,什么时候回TextView处理滑动,什么时候不处理滑动 1.1往上滑动,到达文本底部就不要再处理了,如果往上滑动不在底部则继续TextView滑动 1.2往下滑动,到达文本顶部就不要再处理了,如果往下滑动不在顶部则继续TextView滑动 关键计算地方: 1.当前是上滑动还是下滑动(相对于屏幕) ,使用ev.getRawY()获得当前滑动位置在屏幕哪个地方 2.  计算文本客滑动到哪里即可停止, (行高*总文本行数)- (行高 * 最多显示行数)   int sum = getL

(转)ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

ViewPager,ScrollView 嵌套ViewPager滑动冲突解决 本篇主要讲解一下几个问题 粗略地介绍一下View的事件分发机制 解决事件滑动冲突的思路及方法 ScrollView 里面嵌套ViewPager导致的滑动冲突 ViewPager里面嵌套ViewPager 导致的滑动冲突 轮播图的几种实现方式 先看一下效果图 ScrollView里面嵌套ViewPager ViewPager里面嵌套ViewPager View的 事件分发机制 这篇博客大打算详细讲解View的事件分发机制

解决 viewpager fragment 切换 Fragment被销毁的问题

当我们用FragmentViewPagerAdapter和ViewPager来完成滑动切换选项卡时,效果非常不错,但是后来遇到一个问题,FragmentA切换到FragmentB,再滑到FragmentC时,FragmentA的状态数据已经不予保存了,再次滑动到FragmentB时,FragmentA的oncreateView方法会重新调用,如果有网络请求,将会是非常蛋疼,在网上找了半天,最后看到viewpager中有个这样的方法setOffscreenPageLimit,设置为2,然后再一试,

完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题

/******************************************************************************* * Copyright 2011, 2012 Chris Banes. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the Li

【原创】【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

ViewPager中切换界面Fragment被销毁的问题分析 1.使用场景 ViewPager+Fragment实现界面切换,界面数量>=3 2.Fragment生命周期以及与Activity生命周期对比                    3.问题描述 按上图所说,只有当Fragment所Attached的Activity执行destroy的时候才会调用onDestoryView方法,然而现实是: 当界面由2切换到1的时候,3界面对应的Fragment实际上走了如下流程: 1 -->onP

PullToRefreshListView中嵌套ViewPager滑动冲突的解决

PullToRefreshListView中嵌套ViewPager滑动冲突的解决 最近恰好遇到PullToRefreshListView中需要嵌套ViewPager的情况,ViewPager 作为头部添加到ListView中,发先ViewPager在滑动过程中流畅性太差几乎很难左右滑动.在网上也看了很多大神的介绍,看了ViewPager的源码.其实思路很简单,只不过没有看到有教完整的说明,为了帮转像我这样的green hand 少走弯路,将过程整理下.大神自动略过~_~: 滑动冲突的解决大概要处