首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android中的Fling手势和Webview

Android中的Fling手势和Webview
EN

Stack Overflow用户
提问于 2010-11-20 04:40:10
回答 3查看 15.4K关注 0票数 12

我有一个webview控件,它需要支持Android中的fling手势,以便打开一个新记录(加载新数据)。这发生在扩展Activity的类中。我见过的所有示例都展示了如何实现对文本视图的手势支持,但对webview却一无所获。

我需要为向左和向右的翻转执行不同的动作。任何代码的帮助都将不胜感激,因为这完全把我难倒了。

下面是我的基本onCreate和类

代码语言:javascript
复制
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.os.Bundle;
import android.text.Html;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;

import android.webkit.WebView;

public class ArticleActivity extends Activity   {

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);



    Window  w = getWindow();

     w.requestFeature(Window.FEATURE_LEFT_ICON);

     WebView webview = new WebView(this);
     setContentView(webview); 



     w.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
     R.drawable.gq);




    setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
    populateFields();
    webview.loadData(question + answer, "text/html", "utf-8");



  //   
}
private void populateFields() {

....


}

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-20 05:09:05

创建GestureListener和GestureDetector。通过重写webview的onTouchEvent来调用GestureDetector.onTouchEvent。

您也可以直接覆盖Activity onTouchEvent btw。我可以张贴一些代码,如果你需要。

编辑:根据要求编写代码。

代码语言:javascript
复制
public class Main extends Activity {

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

        MyWebView webview = new MyWebView(this);
        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()) {
                    show_toast("swipe left");
                } else {
                    show_toast("swipe right");
                }
                return true;
            }
        };

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

@littleFluffyKitty。我假设在默认情况下,你指的是WebView触摸事件,当它弹出缩放控件等时?我没有测试过这个。我发现实现自己的手势检测效果最好(但不确定它是否在WebView上效果最好)。您需要将触摸事件视为三个不同的组件。按下,移动(如果有的话)和新闻发布,当按下,移动,释放总是发生的。

如果在onDown上返回false,则操作应该向下传递到WebView触摸事件处理程序,但iirc会停止传递给GestureDetector的后续事件。这也是我基于Android源码实现自己的代码的一半原因。iirc我是从索尼爱立信教程中得到这个想法的,它可以从市场上下载。它是3D列表,其中显示了代码,并且非常容易改编。

票数 12
EN

Stack Overflow用户

发布于 2011-11-25 17:43:10

我更新了代码,这将允许调用本机事件处理程序,如果用户没有触动

代码语言:javascript
复制
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.webkit.WebView;

public class MyWebView extends WebView {
    private boolean flinged;

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

    public MyWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        gd = new GestureDetector(context, sogl);
    }

    GestureDetector gd;


    @Override
    public boolean onTouchEvent(MotionEvent event) {
         gd.onTouchEvent(event);
         if (flinged) {
             flinged = false;
             return true;
         } else {
             return super.onTouchEvent(event);
         }
    }

    GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() {
    // your fling code here
        public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
            if (event1.getX() < 1200 && event1.getX() > 80) {
                return false;
            }
            if (Math.abs(event1.getY() - event1.getY()) > SWIPE_MAX_OFF_PATH)
                return false;
            if(event1.getX() - event2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                loadUrl("javascript:changePage('LEFT')");
                Log.i("Swiped","swipe left");
                flinged = true;
            } else if (event2.getX() - event1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                loadUrl("javascript:changePage('RIGHT')");
                Log.i("Swiped","swipe right");
                flinged = true;
            }
            return true;
        }
    };
}
票数 6
EN

Stack Overflow用户

发布于 2011-05-26 10:18:57

@Han,原谅@techiServices他的意外答案。

上面代码的问题是,在所有情况下,它都会为onFling和onDown返回true。相反,您希望为未处理的事件或未处理的事件中的条件返回false。实际上,在onTouchEvent中,可以通过返回以下内容将调用传递给基类

代码语言:javascript
复制
super.onTouchEvent(event);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4229177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档