我做什麼是第一個導入android.view.GestureDetector
這樣我就可以用它來檢測手勢。 Android有許多默認手勢,可在GestureDector class中自動檢測到。大部分信息都是here,但下面的代碼是我在實際項目中使用的一種形式。
首先,我在我的Activity中創建了一個匿名類(它可以嵌套到任何地方,但我傾向於在右下角的右括號處使用匿名類)。注意:您也可以實施OnGestureListener
作爲班級的一部分。
下面的代碼是用於使用手勢檢測來給出一個簡單的隱藏/顯示。
我已經聲明並定義了我的操作欄(我的UI,它最初是隱藏的)作爲一個實例變量,所以我可以在這裏和其他任何地方訪問它,但是您可以用它代替getActionBar().show()
和getActionBar().hide()
如果您不想將其聲明爲實例變量。替換在這裏actionBar
的地方你的用戶界面:
public class Example extends ActionBarActivity {
// declared in onCreate() method
private android.support.v7.app.ActionBar actionBar;
private GestureDetectorCompat mDetector;
private YourView view1;
private YourView view2;
private YourView view3;
private YourView view4;
// some other code
class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final String DEBUG_TAG = "Gestures in Example Class";
@Override
public boolean onDoubleTap(MotionEvent event) {
Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
// if there is a double tap, show the action bar
actionBar.show();
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
// if the tap is below the action bar, hide the action bar
if (event.getRawY() > getResources().getDimension(R.dimen.abc_action_bar_default_height)) {
actionBar.hide();
return true;
}
return false;
}
@Override
public boolean onDown(MotionEvent event) {
return true;
}
} // end-of-Example Class
然後在我的onCreate()
我宣佈我的GestureDetector
並(可選)設置我的GestureListeners
:
private GestureDetectorCompat mDetector;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// some code here
mDetector = new GestureDetectorCompat(this, new GestureListener());
// this code is for more advanced view logic not needed for a basic set-up
//setGestureListeners();
} // end-of-method onCreate()
然後以實際發送手勢待處理我們提供了這樣做的說明,我知道有兩種方式,第一種最簡單:
/**
* This method recognizes a touchEvent and passes it to your custom GestureListener
* class.
*/
@Override
public boolean onTouchEvent(MotionEvent event){
this.mDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
第二種方法比較複雜,但如果只想識別佈局中某些View
的觸摸事件,就像在重疊視圖並且只能訪問頂部View
的情況下一樣,您可以創建一個自定義類來傳遞事件周圍或達:
class MyOnTouchListener implements View.OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
if (v.equals(view4)) {
return mDetector.onTouchEvent(event);
} else return false;
}
} // end-of-class MyOnTouchListener
,然後在這裏使用它:
public void setGestureListeners() {
/* when we return false for any of these onTouch methods
* it means that the the touchEvent is passed onto the next View.
* The order in which touchEvents are sent to are in the order they
* are declared.
*/
view1.setOnTouchListener(new MyOnTouchListener());
view2.setOnTouchListener(new MyOnTouchListener());
view3.setOnTouchListener(new MyOnTouchListener());
view4.setOnTouchListener(new MyOnTouchListener());
} // end-of-method setGestureListeners()
在我setGestureListeners
方法,我給他們所有相同的命令集,基本上只能識別上view4
touchEvents。否則,它只是將touchEvent傳遞給下一個視圖。
這是使用AppCompat
的代碼,但如果您不是爲舊版本構建的,則可以使用常規的GestureDetector
和ActionBar
。
我也可以確認這種情況正在發生。錯誤? – dell116
是否將它作爲服務運行? –
我也是。這我不能在我的視頻視圖上使用手勢。 –