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