2015-09-03 16 views
15

Tôi có một số ViewPager đang hiển thị các trang của Phân đoạn. Mỗi Fragment là một WebView hiển thị một trang web ngoại tuyến. Một số trong những trang web này có javascript swipe sự kiện trong họ để làm cho họ làm việc.Dừng sự kiện cảm ứng khỏi bị chặn bởi ViewPager nếu có sự kiện chạm trong chế độ xem web

Tôi muốn triển khai như vậy nếu webview không có sự kiện vuốt (trong javascript), thì sự kiện chạm được chuyển đến ViewPager, nếu không nó được webview sử dụng.

Tôi đã thử cách ghi đè các ViewPagers

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

Tuy nhiên điều này đã ngăn cản ViewPager từ việc swipeable (như mong đợi), nhưng cũng dừng sự kiện swipe đạt webview, vì vậy tôi có hai kết quả không mong muốn.

Có cách nào để chuyển sự kiện chạm tới webView trước không nếu nó không được tiêu thụ trong đoạn chuyển nó trở lại ViewPager?

Trong trường hợp tôi đã thực hiện một sai lầm trong MyViewPager của tôi, tôi có mã:

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; 
} 

}

Trả lời

8

Tôi đã có ngay bây giờ hai giải pháp cho vấn đề này trên đã được mở rộng một lớp ViewPager và trọng

public boolean onInterceptTouchEvent(MotionEvent event) 
{ 
    // code 
} 

tuy nhiên một giải pháp tốt hơn là để ghi đè lên

protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { 
    return true; 
} 

cho đầy đủ ở đây là cả lớp

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; 
} 
} 

hy vọng nó sẽ giúp người khác

Các vấn đề liên quan