2012-10-29 107 views
2

我的問題:有沒有在FragmentActivity中使用onTouchEvent的解決方法?如何使用FragmentActivity實現onTouchEvent

我的情況:我正在寫一個簡單的手電筒應用程序,我有一個FragmentActivity,用戶可以在顏色之間刷卡(整個屏幕只有一個顏色這個程序是個人進步)。我想能夠做一個onLongPress事件的選項,一個onDoubleTap事件隱藏導航欄,最重要的是觸摸事件來控制應用程序的亮度(我想讓用戶上下滾動亮度變化!,這裏的任何想法,歡迎對這個onFling事件好)

我已經試過:我有一個GestureDetector我的執行的SimpleOnGestureListener的。我忽略了FragmentActivity中的onTouchEvent,但我剛剛發現這種方法從來沒有在FragmentActivity中被調用過(我也在方法中測試了這個方法,並且它從未被調用過)。有沒有解決辦法?謝謝!

凸代碼:

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

能否請你分享代碼和該項目的佈局? – Soham

+0

@Soham,查看更新。 – kentcdodds

+0

由於'ViewPager'和/或'ViewPager'中的片段,活動中丟失的觸摸事件很可能發生。 Activity的'onTouchEvent'方法只有在其中的視圖沒有處理觸摸事件時纔會被調用。另外,如果我沒有弄錯,你也應該在'SimpleGestureListener'中實現'onDown'來返回'true'。 – Luksprog

回答

7

因此,解決的辦法是比較容易的。問題是ViewPager正在吃觸摸事件。所以我所做的就是編寫我自己的ViewPager實現,並通過調用super.onTouchEvent(event)並將該事件傳遞給類中的gestureDetector來覆蓋onTouchEvent(MotionEvent event)方法。

相關代碼:

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

嘗試這樣做:

gestureDetector = new GestureDetector(this); 

,並在此的TouchEvent:

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

Source

+0

這有點過時了。 GestureDetector的構造函數現在將SimpleOnGestureListener作爲第二個參數。另外,問題在於,我在活動中重寫的'onTouchEvent'方法(以及您所引用的方法)永遠不會被調用。你的回答不會解決問題。 – kentcdodds

+0

但謝謝你的嘗試!並歡迎來到StackOverflow :) – kentcdodds

+0

哈哈謝謝抱歉couldnt幫助 –

相關問題