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

本文介绍了如何处理WebView与ViewPager的触摸事件交互问题,当WebView内部有滑动事件时阻止ViewPager拦截触摸事件,反之则允许ViewPager滑动。通过自定义ViewPager类,覆盖onInterceptTouchEvent()和canScroll()方法来实现这一功能。

我有一个显示碎片页面的ViewPager 。 每个片段都是显示离线网站的WebView。 其中一些网页浏览器中的JavaScript刷卡事件,使他们的工作。

我想实现这样的,如果webview没有滑动事件(在JavaScript内),然后触摸事件传递给ViewPager ,如果不是它被消费的networkingViewPager 。

我试图覆盖ViewPagers

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

}

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

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

然而更好的解决scheme是覆盖

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

为了完整,这里是整个class级

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

希望它能帮助别人

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值