【问题标题】:How to override some gesture events over a webview, but let others through?如何在 webview 上覆盖一些手势事件,但让其他人通过?
【发布时间】:2011-03-02 19:18:08
【问题描述】:

我仍在弄清楚 SDK 的来龙去脉,所以请耐心等待。

所以我正在尝试实现一个 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");

实际上只检测水平抛投。

但是,我还没有弄清楚如何确保水平翻转触发我选择的操作,而垂直翻转仍然控制相关 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();
 }
}
}

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

【问题讨论】:

    标签: android webview android-webview gestures


    【解决方案1】:

    您要做的是在您的 onTouchEvent 中添加代码,以检查 GestureDetector 的 onTouchEvent 的返回值,如果为 false,则使用该事件调用 WebView 超类,如下所示:

    <code>
        @Override 
    
        public boolean onTouchEvent(MotionEvent event) {
    
            return (gd.onTouchEvent(event) 
                || super.onTouchEvent(event)); 
        }  
    </code>
    

    然后,如果您正在处理事件,您的 onFling 方法可以返回 true,如果您希望 WebView 处理事件,则返回 false。您还需要将 onDown 更改为返回 false,以便 WebView 在初始向下事件中获得机会。

    【讨论】:

    • 感谢完美。我知道让超类处理它是 return false 但我错过了 || super.onTouchEven。非常感谢!
    • 我尝试了您的解决方案,但仍然无法单击 html 元素。我添加了return false,其中 Robin Eisenberg 有 //MyWebView.pageUp(true); /*can't work, as explained above*/ 和您的 onTouchEvent 方法
    【解决方案2】:

    我编写了从 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)); 
    }  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      • 2010-10-02
      • 2010-12-06
      相关资源
      最近更新 更多