我的问题:在FragmentActivity中使用onTouchEvent是否有解决办法?
我的情况:我正在编写一个简单的手电筒应用程序,我有一个FragmentActivity,用户可以在颜色之间滑动(整个屏幕只有一种颜色。这个应用程序是为了个人改进)。我希望能够为选项执行onLongPress
事件,使用隐藏导航栏的onDoubleTap
事件,以及最重要的触摸事件来控制应用的亮度(我想让用户上下滚动亮度变化,欢迎任何想法!onFling
事件对此有利吗?)
我尝试了什么:我的GestureDetector
实施了SimpleOnGestureListener
。我覆盖了onTouchEvent
中的FragmentActivity
,但我刚刚发现此方法永远不会在FragmentActivity
中调用(我也在方法中使用Log.print
进行了测试它永远不会被称为)。有解决方法吗?谢谢!
突出代码:
MainActivity:
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>
我认为你不需要其他任何东西来回答这个问题,但如果你这样做,请告诉我。
答案 0 :(得分:7)
因此解决方案相对容易。问题是ViewPager正在吃触摸事件。所以我所做的就是编写自己的ViewPager实现,并通过调用onTouchEvent(MotionEvent event)
覆盖super.onTouchEvent(event)
方法,然后将事件传递给类中的gestureDetector。
相关代码:
MainActivity
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>
答案 1 :(得分:1)
尝试这样做:
gestureDetector = new GestureDetector(this);
并在TouchEvent上:
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureDetector.onTouchEvent(me);
}
答案 2 :(得分:1)
如果您只想检测用户何时触及fragmentActivity,请使用以下方法:
public void onUserInteraction(){
Log.d("FragmentActivity","touched");
}
更多信息:http://developer.android.com/reference/android/support/v4/app/FragmentActivity.html