Javascript 如果webview中存在触摸事件,则禁止ViewPager截取触摸事件

Javascript 如果webview中存在触摸事件,则禁止ViewPager截取触摸事件,javascript,android,android-fragments,webview,Javascript,Android,Android Fragments,Webview,我有一个ViewPager,它可以显示片段页面。每个片段都是一个显示脱机网站的WebView。其中一些Web视图中包含javascript滑动事件以使其正常工作 我希望实现这样的功能:如果webview没有滑动事件(在javascript中),那么触摸事件将被传递到ViewPager,如果没有,则由webview使用 我已尝试覆盖ViewPager @Override public boolean onInterceptTouchEvent(MotionEvent event) { re

我有一个
ViewPager
,它可以显示片段页面。每个片段都是一个显示脱机网站的WebView。其中一些Web视图中包含javascript滑动事件以使其正常工作

我希望实现这样的功能:如果webview没有滑动事件(在javascript中),那么触摸事件将被传递到
ViewPager
,如果没有,则由webview使用

我已尝试覆盖ViewPager

@Override
public boolean onInterceptTouchEvent(MotionEvent event)
{
    return (this.swipeable) ? super.onInterceptTouchEvent(event) : false;
}
然而,这阻止了
ViewPager
的可滑动(如预期的那样),但也阻止了滑动事件到达webview,因此我有两个不希望的结果

有没有办法先将触摸事件传递给webView,然后再将其传递回
ViewPager
的片段中未使用触摸事件

如果我在我的
MyViewPager
中出错,我有以下代码:

public class MyViewPager extends ViewPager implements   GestureDetector.OnGestureListener
{
private static final String TAG = MyViewPager.class.getSimpleName();
private boolean swipeable = true;
private float lastX   = 0;
private long lastTime = 0 ;
private GestureDetector mGestureDetector;
private boolean mScrolling = false;

public MyViewPager(Context context) {
    super(context);
    mGestureDetector = new GestureDetector(context, this);
}

public MyViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    mGestureDetector = new GestureDetector(context, this);
}

public void setSwipeable(boolean swipeable) {
    this.swipeable = swipeable;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event)
{

   /* float speed = 0;
    if(event.getAction() == MotionEvent.ACTION_MOVE)
    {
        if(lastX!=0) {
            speed = (event.getRawX()- lastX) / (System.currentTimeMillis()-lastTime);
            if(speed < 0.0 ){speed *=-1;}
            Log.e(TAG, "Move at speed ->"+speed);
            if(speed >0.5){return false;}
        }
        lastX    = event.getRawX();
        lastTime = System.currentTimeMillis();
        return true;
    }*/
  // return true;

    return (this.swipeable) ? super.onInterceptTouchEvent(event) : false;
}

@Override
public boolean onTouchEvent(MotionEvent event)
{
    Log.i(TAG, "onTouch event");
  //  mGestureDetector.onTouchEvent(event);
    return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velX, float velY) {
    Log.i(TAG, "flinging");
    return false;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distX, float distY)
{
    float displacement = distX;
    return false;
}

// Unused Gesture Detector functions below

@Override
public boolean onDown(MotionEvent event) {
    return false;
}

@Override
public void onLongPress(MotionEvent event) {
    // we don't want to do anything on a long press, though you should probably feed this to the page being long-pressed.
}

@Override
public void onShowPress(MotionEvent event) {
    // we don't want to show any visual feedback
}

@Override
public boolean onSingleTapUp(MotionEvent event) {
    // we don't want to snap to the next page on a tap so ignore this
    return false;
}
公共类MyViewPager扩展了ViewPager,实现了GestureDetector.OnTestureListener
{
私有静态最终字符串标记=MyViewPager.class.getSimpleName();
私有布尔开关=真;
私有浮动lastX=0;
私有长lastTime=0;
私人手势检测器mGestureDetector;
私有布尔值=false;
公共MyViewPager(上下文){
超级(上下文);
mGestureDetector=新的GestureDetector(上下文,本);
}
公共MyViewPager(上下文、属性集属性){
超级(上下文,attrs);
mGestureDetector=新的GestureDetector(上下文,本);
}
公共无效设置可擦除(布尔可切换){
this.swipeable=swipeable;
}
@凌驾
公共布尔值onInterceptTouchEvent(MotionEvent)
{
/*浮动速度=0;
if(event.getAction()==MotionEvent.ACTION\u MOVE)
{
如果(lastX!=0){
速度=(event.getRawX()-lastX)/(System.currentTimeMillis()-lastTime);
如果(速度<0.0){speed*=-1;}
Log.e(标记“以速度移动->”+速度);
如果(速度>0.5){返回false;}
}
lastX=event.getRawX();
lastTime=System.currentTimeMillis();
返回true;
}*/
//返回true;
return(this.swipeable)?super.onInterceptTouchEvent(事件):false;
}
@凌驾
公共布尔onTouchEvent(运动事件)
{
Log.i(标记“onTouch事件”);
//mGestureDetector.onTouchEvent(事件);
返回false;
}
@凌驾
公共布尔onFling(MotionEvent e1、MotionEvent e2、float velX、float velY){
Log.i(标记为“投掷”);
返回false;
}
@凌驾
公共布尔onScroll(MotionEvent e1、MotionEvent e2、float distX、float distY)
{
浮动位移=distX;
返回false;
}
//未使用的手势检测器功能如下
@凌驾
公共布尔onDown(运动事件){
返回false;
}
@凌驾
public void onLongPress(运动事件){
//我们不希望在长时间按下时执行任何操作,尽管您可能应该将此信息输入到长时间按下的页面。
}
@凌驾
在ShowPress上公开作废(运动事件){
//我们不想显示任何视觉反馈
}
@凌驾
公共布尔onSingleTapUp(运动事件){
//我们不想点击一下就跳到下一页,所以忽略这个
返回false;
}

}

我现在有两种解决此问题的方法,一种是扩展a ViewPager类,另一种是重写

public boolean onInterceptTouchEvent(MotionEvent event)
{
   // code  
}
然而,一个更好的解决方案是覆盖

protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
  return true;
}
为了完整起见,这是整个课程

public class ZoltansViewPager extends ViewPager {

 private static final String TAG = ZoltansViewPager.class.getSimpleName();
 private boolean swipeable = true;
 private float lastX   = 0;
 private long lastTime = 0 ;
 private GestureDetector mGestureDetector;
 private boolean mScrolling = false;


 public ZoltansViewPager(Context context) {
    super(context);
 }

 public ZoltansViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
 }


 public void setSwipeable(boolean swipeable) {
    this.swipeable = swipeable;
 }

 @Override
 protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
     Log.i(TAG , " boolean checkV ->"+checkV + ", int dx-> "+dx+", int x->"+x+", int y->"+y);
     if(x <300 || x >1700 ){return true;}
     return false;
 }
}
公共类ZoltansviewPage扩展了ViewPager{
私有静态最终字符串标记=zoltansviewpage.class.getSimpleName();
私有布尔开关=真;
私有浮动lastX=0;
私有长lastTime=0;
私人手势检测器mGestureDetector;
私有布尔值=false;
公共ZoltansviewPage(上下文){
超级(上下文);
}
公共ZoltansviewPage(上下文、属性集属性){
超级(上下文,attrs);
}
公共无效设置可擦除(布尔可切换){
this.swipeable=swipeable;
}
@凌驾
受保护的布尔值可滚动(视图v、布尔值检查v、整数dx、整数x、整数y){
Log.i(标记,“布尔校验V->”+checkV+”,int-dx->“+dx+”,int-x->“+x+”,int-y->“+y);
如果(x1700){返回true;}
返回false;
}
}
希望它能帮助别人