我所做的是首先导入android.view.GestureDetector
,所以我可以用它来检测手势。Android 有许多在GestureDector 类中自动检测的默认手势。大部分信息都可以在这里找到,但下面是我在实际项目中使用的代码形式。
首先,我在我的活动中创建了一个匿名类(它可以嵌套在任何地方,但我倾向于将匿名类放在底部,就在右括号之前)。注意:您也可以OnGestureListener
将其作为类的一部分来实现。
下面的代码用于使用手势检测来提供简单的隐藏/显示。
我已将我的操作栏(我的 UI,最初是隐藏的)声明并定义为实例变量,因此我可以在此处以及其他任何地方访问它,但您可以将其替换为 agetActionBar().show()
和getActionBar().hide()
在您不想要的情况下将其声明为实例变量。用你的 UI 代替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
布局中某些 s 上的触摸事件,例如在您有重叠视图并且只能访问 top 的情况下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
方法中,我给了他们所有相同的命令集,基本上只识别 touchEvents on view4
。否则,它只是将 touchEvent 传递给下一个视图。
这是使用 的代码AppCompat
,但如果您不是为旧版本构建,您可以使用常规的GestureDetector
and ActionBar
。