【问题标题】:How to implement onTouchEvent with a FragmentActivity如何使用 FragmentActivity 实现 onTouchEvent
【发布时间】:2012-10-18 20:32:46
【问题描述】:

我的问题:是否有在 FragmentActivity 中使用 onTouchEvent 的解决方法?

我的情况:我正在编写一个简单的手电筒应用程序,并且我有一个 FragmentActivity,用户可以在其中在颜色之间滑动(整个屏幕只有一种颜色。这个应用程序是为了个人改进)。我希望能够为选项执行onLongPress 事件,为隐藏导航栏执行onDoubleTap 事件,以及最重要的是一个触摸事件来控制应用程序的亮度(我想让用户向上和向下滚动以更改亮度,欢迎在这里提出任何想法!onFling 事件对此有用吗?)

我的尝试:我有一个 GestureDetector 和我的 SimpleOnGestureListener 实现。我覆盖了FragmentActivity 中的onTouchEvent,但我刚刚发现从未在FragmentActivity 中调用此方法(我还在该方法中使用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());
  }
}

我的手势监听器:

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>

我认为您不需要其他任何东西来回答这个问题,但如果您需要,请告诉我。

【问题讨论】:

  • 能否分享一下项目的代码和布局?
  • 活动中丢失的触摸事件很可能是由于ViewPager 和/或ViewPager 中的片段而发生的。仅当其中的视图未处理触摸事件时,才会调用 ActivityonTouchEvent 方法。另外,如果我没记错的话,您还应该在SimpleGestureListener 中实现onDown 以返回true
  • 有没有办法克服这个@Luksprog?
  • 你是否也在手势监听器中实现了onDown 方法?你在这些碎片中有什么?那里有任何触摸事件监听器吗?
  • @Luksprog,没有。片段只是覆盖onCreateView 方法。我没有实现onDown。我应该吗?

标签: java android touch-event android-fragmentactivity


【解决方案1】:

尝试这样做:

gestureDetector = new GestureDetector(this);

在 TouchEvent 上:

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

Source

【讨论】:

  • 这有点过时了。 GestureDetector 的构造函数现在将 SimpleOnGestureListener 作为第二个参数。此外,问题是我在活动中覆盖的onTouchEvent 方法(以及您正在引用的)从未被调用。你的回答不能解决问题。
【解决方案2】:

所以解决这个问题相对容易。问题是 ViewPager 正在吃触摸事件。所以我所做的是编写自己的 ViewPager 实现,并通过调用 super.onTouchEvent(event) 覆盖 onTouchEvent(MotionEvent event) 方法,然后将事件传递给类中的gestureDetector。

相关代码:

主活动

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

我的手势监听器

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>

【讨论】:

    【解决方案3】:

    如果您只想简单地检测用户何时触摸 fragmentActivity,请使用以下方法:

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

    更多信息:http://developer.android.com/reference/android/support/v4/app/FragmentActivity.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多