2011-03-02 104 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)); 
} 
}