2010-11-19 32 views
11

我有一個webview控件,需要在Android中支持該手勢,以便創建新記錄(加載新數據)。這發生在擴展Activity的類中。我見過的所有示例都演示瞭如何實現textview的手勢支持,但沒有爲webview提供任何支持。在Android中彈出手勢和Web視圖

我需要對左右甩尾都執行不同的操作。任何代碼的幫助將不勝感激,因爲這完全讓我難住。

這裏是我的基本的onCreate和我的課

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() { 

.... 


} 

} 

回答

11

創建GestureListener和GestureDetector。通過覆蓋webview的onTouchEvent調用GestureDetector.onTouchEvent。

你也可以重寫Activity onTouchEvent btw。如果您需要,我可以發佈一些代碼。

編輯:代碼按要求。

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列表,顯示了代碼並很容易適應。

+0

我已經嘗試過這種方法,它似乎阻止了默認的WebView觸摸事件。我也嘗試過在Activity上實現而不是在WebView上,它也沒有工作。這似乎是onDown的重寫是問題,但由於它似乎沒有工作,我不知道如何得到這個工作,而不會搞亂WebView的正常操作。任何其他建議嘗試? – cottonBallPaws 2011-01-05 21:56:50

+1

@littleFluffyKitty。請在我的回答中看到我的編輯。讓我知道如果我能有更多的幫助。 – techiServices 2011-01-05 23:18:26

+0

我同意@littleFluffyKitty仍然 - 即使在編輯後,它看起來這個代碼增加了一觸即發的功能,但禁用所有的默認WebView觸摸事件,哪種打敗了目的。我感興趣的是滾動和點擊,我不應該重寫自己。 – Han 2011-05-16 02:55:36

2

@Han,原諒@techi爲他不需要的答案服務。

上述代碼的問題是,在所有情況下,它都會在onFling和onDown中返回true。你想要的是對於你不處理的事件或者你不處理的事件中的條件返回false。或者實際上,在你的onTouchEvent可以通過返回

super.onTouchEvent(event); 
4

我更新的代碼通過調用基類,它將會允許調用本地事件處理程序,如果用戶沒有flinged

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; 
     } 
    }; 
}