2011-03-02 109 views
4

我还在搞清楚SDK的来龙去脉,所以请在这里与我联系。如何通过webview覆盖一些手势事件,但让别人通过?

所以我试图实现一个Webview,保持多点触控缩放控件和垂直滚动完好(webview类处理它们),同时锁定Webview上的水平滚动,并实现水平查找新数据。

我发现这个:Fling Gesture and Webview in Android 。因此,我使用此代码来了解如何在后来的应用程序中实现此功能,所以我在那里工作(当然,答案是)。

并开始将代码调整到适合我的程度。例如:

if (event1.getRawX() > event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100) { 
    show_toast("swipe left"); 
    } else if(event1.getRawX() < event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100){ 
    show_toast("swipe right"); 

实际上仅检测水平fl。。

但是,我还没有想出如何确保水平闪动触发我选择的动作,而垂直闪动仍然控制有问题的WebView的滚动。

我的第一个想法是在webview上尝试诸如pageUp/pageDown或scrollTo之类的东西,但无法工作,因为我将webview类扩展到MyWebView,因此还没有此类型的实例化对象。

这是完整的代码,如果需要的话:

package test.fling; 


import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.webkit.WebView; 
import android.widget.Toast; 

public class testicules extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    MyWebView webview = new MyWebView(this); 
    webview.loadUrl("http://en.wikipedia.org/wiki/Android"); 
    setContentView(webview); 
} 

class MyWebView extends WebView { 
Context context; 
GestureDetector gd; 

public MyWebView(Context context) { 
super(context); 

this.context = context; 
    gd = new GestureDetector(context, sogl); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
return gd.onTouchEvent(event); 
} 

GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { 
    public boolean onDown(MotionEvent event) { 
    return true; 
    } 
    public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { 
    if (event1.getRawX() > event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100) { 
    show_toast("swipe left"); 
    } else if(event1.getRawX() < event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100){ 
    show_toast("swipe right"); 
    } else { 
    //MyWebView.pageUp(true); /*can't work, as explained above*/ 
    } 
return true; 
    } 
}; 

void show_toast(final String text) { 
    Toast t = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
    t.show(); 
} 
} 
} 

任何帮助将不胜感激。谢谢!

回答

7

你想在这里做的是将代码添加到您的onTouchEvent检查从GestureDetector的的onTouchEvent的返回值,如果是假的,然后调用的WebView超与事件,像这样:

<code> 
    @Override 

    public boolean onTouchEvent(MotionEvent event) { 

     return (gd.onTouchEvent(event) 
      || super.onTouchEvent(event)); 
    } 
</code> 

然后,如果您处理事件,则onFling方法可以返回true;如果您希望WebView处理该事件,则返回false。您还需要将onDown更改为返回false,以便WebView在最初的关闭事件中有机会。

+1

非常感谢您的工作。我明白这是让超类处理它的返回错误,但我错过了|| super.onTouchEven。非常感谢你! – 2011-03-03 11:57:49

+1

这正是我所需要的,非常感谢你! – Han 2011-05-16 03:44:20

+0

我试过你的解决方案,但我仍然无法点击html元素。我添加了'return false',其中Robin Eisenberg拥有'//MyWebView.pageUp(true);/*无法工作,如上面解释的* /'和'onTouchEvent'方法 – 2013-08-26 11:43:35

1

我写了从WebView扩展的类,可以轻松检测到滑动。

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.webkit.WebView; 
import android.widget.Toast; 

public class HtmlImageView extends WebView { 

Context mContext; 
GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector()); 

public HtmlImageView(Context context) { 
    super(context); 
    mContext=context; 
} 

public HtmlImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    mContext=context; 
} 

public HtmlImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mContext=context; 
} 

private static final int SWIPE_MIN_DISTANCE = 120; 
private static final int SWIPE_MAX_OFF_PATH = 250; 
private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

class MyGestureDetector extends SimpleOnGestureListener { 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
      float distanceX, float distanceY) { 
     return super.onScroll(e1, e2, distanceX, distanceY); 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      // right to left swipe 
      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Toast.makeText(mContext, "Left Swipe", Toast.LENGTH_SHORT) 
         .show(); 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Toast.makeText(mContext, "Right Swipe", Toast.LENGTH_SHORT) 
         .show(); 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 
} 

public boolean onTouchEvent(MotionEvent event) { 

    return (gestureDetector.onTouchEvent(event) 
     || super.onTouchEvent(event)); 
} 
}