使用OnTouchListener进行手势识别
下面是实例代码
ImageView img;
//对ImageView绑定触摸监听
img.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction())
{
case MotionEvent.ACTION_DOWN:
Toast.makeText(OnTouchActivity.this, "按下", Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(OnTouchActivity.this, "抬起", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
通过参数motionEvent可以获得当前的活动(motionEvent.getAction()方法)
查看MotionEvent类,可以发现其中判断动作的常量
如:
public static final int ACTION_DOWN = 0;按下
public static final int ACTION_UP = 1;抬起
public static final int ACTION_MOVE = 2;移动
public static final int ACTION_CANCEL = 3;取消
...
将当前活动与MotionEvent类中的常量进行比较,便可以知道当前的触摸方式了
除了使用getAction方法来判断当前活动的触摸方式外,还可以通过其他方法来实现更多的手势识别
例如使用getX()方法或getY()方法来获取坐标,并实现识别手指向左向右向上向下滑动的识别功能
示例如下:
img.setOnTouchListener(new View.OnTouchListener() {
float X1 = 0;
float X2 = 0;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction()==MotionEvent.ACTION_DOWN)
{
X1 = motionEvent.getX();
}
else if (motionEvent.getAction()==MotionEvent.ACTION_UP)
{
X2 = motionEvent.getX();
if (X1 - X2 > 60)
{
Toast.makeText(getApplicationContext(), "正在向左滑动", Toast.LENGTH_SHORT).show();
}
else if (X1 - X2 < -60)
{
Toast.makeText(getApplicationContext(), "正在向右滑动", Toast.LENGTH_SHORT).show();
}
}
return true;
}
});
相对而言,直接使用OnTouch来识别手势比较简单,但如果用来处理一些相对复杂的手势时就比较麻烦了
使用OnGestureListener进行手势识别
使用这个类能够识别我们更多的手势,GestureDetector.OnGestureListener接口中带有这么几个方法
@Override
public boolean onDown(MotionEvent motionEvent) {
return true;
//按下时调用
}
@Override
public void onShowPress(MotionEvent motionEvent) {
//按下后未移动未松开时调用
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
return true;
//按下后抬起时调用
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
return true;
//滚动时调用,鼠标滚轮滚动也能触发
}
@Override
public void onLongPress(MotionEvent motionEvent) {
//长按时调用
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
return true;
//滑动时调用
}
其中
onScroll滚动方法,由一个MotionEvent.ACTION_DOWN以及多个MotionEvent.ACTION_MOVE触发
onFling滑动方法由两个MotionEvent触发,参数解释如下:
MotionEvent motionEvent :第一个按下的触摸,即滑动时手指第一次按下时触发
MotionEvent motionEvent1:第二个MotionEvent参数,为手指滑动后抬起时触发,即滑动完成抬起手指时
float v:X轴上的移动速度,像素/秒
float v1:Y轴上的移动速度,像素/秒
下面是使用OnGestureListener手势识别的实例
一:定义一个类实现OnGestureListener接口,并重写其中的方法
public class MyOnTouch implements GestureDetector.OnGestureListener{
Context context;
public MyOnTouch(Context context){
this.context = context;
}
@Override
public boolean onDown(MotionEvent motionEvent) {
Toast.makeText(context, "onDown", Toast.LENGTH_SHORT).show();
return true;
//按下时调用
}
@Override
public void onShowPress(MotionEvent motionEvent) {
Toast.makeText(context, "onShowPress", Toast.LENGTH_SHORT).show();
//按下后未移动未松开时调用
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
Toast.makeText(context, "onSingleTapUp", Toast.LENGTH_SHORT).show();
return true;
//按下后抬起时调用
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
Toast.makeText(context, "onScroll", Toast.LENGTH_SHORT).show();
return true;
//滚动时调用,鼠标滚轮滚动也能触发
}
@Override
public void onLongPress(MotionEvent motionEvent) {
//长按时调用
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
Toast.makeText(context, "onFling", Toast.LENGTH_SHORT).show();
return true;
//滑动时调用
}
}
二:定义一个GestureDetectorCompat对象并传入参数(应用上下文、以及一个OnGestureListener接口,这里传入我们重写过的类)下面是完整的代码
public class OnTouchActivity extends Activity{
//定义一个GestureDetectorCompat对象
GestureDetectorCompat gestureDetectorCompat;
ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_on_touch);
setListener();
}
public void setListener()
{
//为ImageView绑定触摸监听器
img.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
//返回的事件处理为gestureDetectorCompat的事件处理
return gestureDetectorCompat.onTouchEvent(motionEvent);
}
});
}
}