2010-11-19 11 views
11

新しいレコードを表示する(新しいデータを読み込む)ために、Androidでのジェスチャーをサポートする必要があるwebviewコントロールがあります。アクティビティを拡張するクラスで発生しています。私が見たすべての例では、テキストビューのジェスチャーサポートの実装方法を示していますが、Webviewの場合は何も表示されません。AndroidでのフレンドジェスチャーとWebview

左翼と右翼の両方に異なるアクションを実行する必要があります。これは完全に私が困惑しているので、任意のコードの助けをいただければ幸いです。

は、ここに私の基本の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でもうまく動作するかどうかはわかりません。あなたは3つの異なるコンポーネントとしてタッチイベントを見る必要があります。プレスダウン、ムーブメント(もしあれば)、プレスリリース、プレスダウン、移動、リリースは常に起こります。

onDownでfalseを返した場合、アクションはWebViewタッチイベントハンドラに渡されますが、iircはGestureDetectorに渡される後続のイベントを停止します。 Androidのソースに基づいて自分自身を実装する理由の半分です。 iirc私は市場からダウンロード可能なSony Ericssonチュートリアルからアイデアを得ました。それは、コードとそれに適応するのはかなり簡単に示す3Dリストです。

+0

をflingedしなかった場合、ネイティブのイベントハンドラを呼び出すことができますこの方法を試してみて、デフォルトのWebViewタッチイベントをブロックしているようです。私はWebViewの代わりにActivityでこれを実装しようとしましたが、どちらもうまくいきませんでした。 onDownのオーバーライドが問題だと思われましたが、それがなければ動作しないようですので、WebViewの通常の操作を邪魔することなくこれを動作させる方法がわかりません。試してみる何かの提案? – cottonBallPaws

+1

@ littleFluffyKitty。私の答えは私の編集を見てください。もし私がもっと助けになることができたら教えてください。 – techiServices

+0

私は@littleFluffyKittyにまだ賛成です - 編集後でさえ、このコードは飛行機能を追加しますが、目的を破るデフォルトのWebViewタッチイベントをすべて無効にします。私が興味を持っているのはスクロールとクリックです。私は自分自身を書き直す必要はありません。 – Han

2

@ハン、許して@techiServices彼の呼び掛けられない答え。

上記のコードの問題点は、すべてのケースでonFlingとonDownに対してtrueを返すことです。代わりに、あなたが処理しないイベント、または処理しないイベントの条件に対してfalseを返すことが必要です。または実際に、onTouchEventであなたは、私は、コードを更新

super.onTouchEvent(event); 
4

を返すことで、基本クラスへの呼び出しを渡すことができ、これはこれで、ユーザーは、私は

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