私の方法という問題があります
@Override
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
より新しいと呼ばれます。なぜそうなのでしょうか?私はグーグルのAPI 4.0.3アプリケーションを構築しており、viewFliperのスワイプを有効にしようとしています。ただし、on touchの呼び出しが新しい場合は機能しません。
ところで:
public class MainActivity extends SherlockMapActivity implements ActionBar.TabListener {
それが私の活動の宣言です。そしてスワイプを検出するために私はそれを実装しました:
SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
float sensitvity = 50;
if((e1.getX() - e2.getX()) > sensitvity){
SwipeLeft();
}else if((e2.getX() - e1.getX()) > sensitvity){
SwipeRight();
}
return true;
}
};
GestureDetector gestureDetector= new GestureDetector(simpleOnGestureListener);
ありがとう!
編集:
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/main_view"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="horizontal" >
<ViewFlipper
Android:id="@+id/ViewFlipper"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:background="#ffffff" >
<include
Android:layout_height="match_parent"
layout="@layout/mymain" />
<include layout="@layout/secondmain" />
<include layout="@layout/thirdmain" />
<include layout="@layout/fourthmain" />
</ViewFlipper>
</LinearLayout>
edit2:含まれているすべてのレイアウトにscrollviewが実装されているため、スクロールがそのイベントを取得して処理する可能性があります。もしそうなら、ジェスチャーを検出する方法は?
私は完璧な解決策を見つけました。新しいメソッドを実装しました:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
View v = getCurrentFocus();
boolean ret = super.dispatchTouchEvent(event);
そして今、それはすべて正常に動作します!
編集:
私の最終的なコード:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
View v = getCurrentFocus();
if (v instanceof EditText) {
View w = getCurrentFocus();
int scrcoords[] = new int[2];
w.getLocationOnScreen(scrcoords);
float x = event.getRawX() + w.getLeft() - scrcoords[0];
float y = event.getRawY() + w.getTop() - scrcoords[1];
if (event.getAction() == MotionEvent.ACTION_UP
&& (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
.getBottom())) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
.getWindowToken(), 0);
}
}
boolean ret = super.dispatchTouchEvent(event);
return ret;
}
Gabrjanの投稿のコメントで書いたように、これは画面に触れている間、これが継続的に発生するので、実際にはタッチダウンイベントのみを取得する簡単な方法があります。
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
System.out.println("TOUCH DOWN!");
//set immersive mode here, or whatever...
}
return super.dispatchTouchEvent(event);
}
これは、Android=を没入モードにすると、どの要素に関係なく画面のいずれかの部分がタッチされるたびに非常に役立ちました。しかし、没入モードを繰り返し設定したくありませんでした!
oK
はい、それは問題です。Androidは各イベントが子から親に移動するタッチイベントを処理するため、まずViewFlipperによって処理されますが、その後ScrollViewに移動します。したがって、getParent()を実装する必要があります。 requestDisallowInterceptTouchEvent(true)( ViewParent class を参照)ViewFlipperですべてのタッチイベントを処理し、水平の場合はジェスチャーの方向を検出し、そうでない場合はビューを反転してからScrollViewにタッチイベントを渡すか、または単にScrollViewをプログラムでスクロールする
編集:また、ViewFlipperでOnTouchListenerを実装し、このリスナーでGestureDetector.onTouchEvent(event)をトリガーできますが、これには、親ビューのrequestDisallowInterceptTouchEventもtrueに設定する必要があります
すべてのジェスチャとタッチイベントは、それを処理できるビュー階層の最下位要素に移動します。したがって、含まれるレイアウトにリスナーがある場合は、((TypeOfParrent)yourView.getParent()).onTouchEvent(event)
を呼び出して、必要なハンドラーにイベントを委任できます。
追加:ビューの反転にViewPager
を使用することをお勧めします。 ViewPagerでは、独自のonGestureListenerを実装する必要はありません。
http://developer.Android.com/reference/Android/support/v4/view/ViewPager.html