2

私の質問: FragmentActivity で onTouchEvent を使用するための回避策はありますか?

私の状況:私は単純な懐中電灯アプリを書いており、ユーザーが色をスワイプできる FragmentActivity を持っています (画面全体が 1 つの色です。このアプリは個人的な改善のためです)。onLongPressオプションのonDoubleTapイベント、ナビゲーションバーを非表示にするイベント、そして最も重要なのは、アプリの明るさを制御するタッチイベントを実行できるようにしたい (ユーザーが明るさの変更のために上下にスクロールできるようにしたい、ここにアイデアがある場合)大歓迎です!onFlingイベントはこれに適していますか?)

私が試したこと:私は のGestureDetector実装でを持っていSimpleOnGestureListenerます。で をオーバーライドしonTouchEventましたFragmentActivityが、このメソッドが a で呼び出されることはないことがわかりましたFragmentActivity(メソッドで a を使用してこれもテストしましたLog.printが、呼び出されることはありません)。回避策はありますか? ありがとう!

顕著なコード:

主な活動:

public class MainActivity extends FragmentActivity {

  private GestureDetector gestureDetector;
  private FragmentPagerAdapter mAdapter;

  /**
   * Called when the activity is first created.
   */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    gestureDetector = new GestureDetector(getApplicationContext(), new MyGestureListener(getWindow()));

    mAdapter = new ColorFragmentAdapter(getSupportFragmentManager(), getDefaultColorList());
    ViewPager pager = (ViewPager) super.findViewById(R.id.viewpager);
    pager.setAdapter(mAdapter);
    pager.setCurrentItem(Math.round(mAdapter.getCount() / 2)); //Set current fragment to middle fragment
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    print("Sending touch event to gestureDetector.");
    //This line is never run.
    return gestureDetector.onTouchEvent(event);
  }

  /**
   * Prints the given object to the log with the debug priority with the tag FLASHLIGHT
   *
   * @param object
   */
  public static void print(Object object) {
    Log.println(Log.DEBUG, "FLASHLIGHT", object.toString());
  }
}

MyGestureListener :

public class MyGestureListener extends SimpleOnGestureListener {

  private final Window window;

  public MyGestureListener(Window window) {
    super();
    this.window = window;
  }

  @Override
  public void onLongPress(MotionEvent e) {
    //onLongPress code
  }

  @Override
  public boolean onDoubleTap(MotionEvent e) {
    //onDoubleTap code
  }

  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    //onFling cod
  }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  >
  <android.support.v4.view.ViewPager
        android:id="@+android:id/viewpager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
</LinearLayout>

質問に答えるのに他に何も必要ないと思いますが、もしあれば教えてください。

4

3 に答える 3

7

したがって、これに対する解決策は比較的簡単です。問題は、ViewPager が touch イベントを食べていることです。そのため、ViewPager の独自の実装を作成し、クラス内でイベントをonTouchEvent(MotionEvent event)呼び出してから、gestureDetector に渡すことでメソッドをオーバーライドしました。super.onTouchEvent(event)

関連コード:

主な活動

public class MainActivity extends FragmentActivity {

  private FragmentPagerAdapter mAdapter;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_main);
    mAdapter = new FragmentAdapter(getSupportFragmentManager());
    MyViewPager pager = (MyViewPager) findViewById(R.id.viewpager);
    pager.setGestureDetector(new GestureDetector(this, new MyGestureListener(this)));
    pager.setAdapter(mAdapter);
    pager.setCurrentItem(Math.round(mAdapter.getCount() / 2));
  }
}

MyViewPager

public class MyViewPager extends ViewPager {

  private GestureDetector gestureDetector;

  public MyViewPager(Context context) {
    super(context);
  }

  public MyViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  @Override
  public boolean onTouchEvent(MotionEvent e) {
    return super.onTouchEvent(e) && gestureDetector.onTouchEvent(e);
  }
}

MyGestureListener

public class MyGestureListener extends SimpleOnGestureListener {

  private final Activity activity;

  public MyGestureListener(Activity activity) {
    super();
    this.activity = activity;
  }

  @Override
  public boolean onDoubleTap(MotionEvent e) {
    //...
  }

  @Override
  public boolean onSingleTapConfirmed(MotionEvent e) {
    //...
  }

//... etc...

}

layout_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
>
  <com.kentcdodds.flashlight.MyViewPager
    android:id="@+android:id/viewpager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
        />
</LinearLayout>
于 2012-11-01T15:48:39.880 に答える
1

ユーザーが fragmentActivity に触れたことを単純に検出したい場合は、次のメソッドを使用します。

public void onUserInteraction(){
  Log.d("FragmentActivity","touched");
}

詳細: http://developer.android.com/reference/android/support/v4/app/FragmentActivity.html

于 2013-12-11T23:32:23.867 に答える
1

これを試してください:

gestureDetector = new GestureDetector(this);

そしてTouchEventでこれ:

   @Override
   public boolean onTouchEvent(MotionEvent me) {
    return gestureDetector.onTouchEvent(me);
}

ソース

于 2012-10-29T17:40:24.083 に答える