如果在webview中存在触摸事件,则停止触摸事件被ViewPager拦截

Mar*_*ist 15 javascript android webview android-fragments

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

我想实现如果webview没有滑动事件(在javascript中),那么触摸事件被传递到ViewPager,如果不是它被webview消耗.

我试过覆盖ViewPagers

@Override
public boolean onInterceptTouchEvent(MotionEvent event)
{
    return (this.swipeable) ? super.onInterceptTouchEvent(event) : false;
}
Run Code Online (Sandbox Code Playgroud)

然而,这阻止了可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;
}
Run Code Online (Sandbox Code Playgroud)

}

Mar*_*ist 8

我现在有两个解决这个问题的方法是扩展一个ViewPager类并覆盖它

public boolean onInterceptTouchEvent(MotionEvent event)
{
   // code  
}
Run Code Online (Sandbox Code Playgroud)

然而,一个更好的解决方案是覆盖

protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
  return true;
}
Run Code Online (Sandbox Code Playgroud)

完整性这里是整个班级

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;
 }
}
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助别人