【发布时间】: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中的片段而发生的。仅当其中的视图未处理触摸事件时,才会调用Activity的onTouchEvent方法。另外,如果我没记错的话,您还应该在SimpleGestureListener中实现onDown以返回true。 -
有没有办法克服这个@Luksprog?
-
你是否也在手势监听器中实现了
onDown方法?你在这些碎片中有什么?那里有任何触摸事件监听器吗? -
@Luksprog,没有。片段只是覆盖
onCreateView方法。我没有实现onDown。我应该吗?
标签: java android touch-event android-fragmentactivity