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;
}
}
希望它能帮助别人