一、使用监听器的方式来判断触摸
//控件对象
private ImageView img;
private TextView txt;
//手势分析对象
private GestureDetector gestureDetector=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
img=(ImageView)findViewById(R.id.img);
txt=(TextView)findViewById(R.id.txt);
//创建手势分析对象--同时设定手势识别监听器,用于监听识别结果,参数--Context,OnGestureListener()
gestureDetector=new GestureDetector(this, new GestureScaleListener());
//View必须设置longClickable为true,否则手势识别无法正确工作
img.setLongClickable(true);
//为ImageView添加触摸监听处理
img.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
Display("ACTION_DOWN",event);
break;
case MotionEvent.ACTION_MOVE:
Display("ACTION_MOVE",event);
break;
case MotionEvent.ACTION_UP:
Display("ACTION_UP",event);
break;
}
return true; //此处必须返回true,才能接收处理移动/抬起事件.
//return gestureDetector.onTouchEvent(event); //此处不作任何触摸处理,转去手势识别对象进行手势分析
}
});
//显示触摸信息
private void Display(String eventType, MotionEvent event){
int x = (int)event.getX();
int y = (int)event.getY();
float pressure = event.getPressure();
float size = event.getSize();
int RawX = (int)event.getRawX();
int RawY = (int)event.getRawY();
String msg = "";
msg += "事件类型:" + eventType + "\n";
msg += "相对坐标:"+String.valueOf(x)+","+String.valueOf(y)+"\n";
msg += "绝对坐标:"+String.valueOf(RawX)+","+String.valueOf(RawY)+"\n";
msg += "触点压力:"+String.valueOf(pressure)+"\n";
msg += "触点尺寸:"+String.valueOf(size)+"\n";
txt.setText(msg);
}
二、使用gesturedetector
//控件对象
private ImageView img;
private TextView txt;
//手势分析对象
private GestureDetector gestureDetector=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
img=(ImageView)findViewById(R.id.img);
txt=(TextView)findViewById(R.id.txt);
//创建手势分析对象--同时设定手势识别监听器,用于监听识别结果,参数--Context,OnGestureListener()
gestureDetector=new GestureDetector(this, new GestureScaleListener());
//View必须设置longClickable为true,否则手势识别无法正确工作
img.setLongClickable(true);
//为ImageView添加触摸监听处理
img.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event); //此处不作任何触摸处理,转去手势识别对象进行手势分析
}
});
}
//显示触摸信息
private void Display(String eventType, MotionEvent event){
int x = (int)event.getX();
int y = (int)event.getY();
float pressure = event.getPressure();
float size = event.getSize();
int RawX = (int)event.getRawX();
int RawY = (int)event.getRawY();
String msg = "";
msg += "事件类型:" + eventType + "\n";
msg += "相对坐标:"+String.valueOf(x)+","+String.valueOf(y)+"\n";
msg += "绝对坐标:"+String.valueOf(RawX)+","+String.valueOf(RawY)+"\n";
msg += "触点压力:"+String.valueOf(pressure)+"\n";
msg += "触点尺寸:"+String.valueOf(size)+"\n";
txt.setText(msg);
}
//手势识别的监听器类--监听手势识别对象的识别结果
class GestureScaleListener implements GestureDetector.OnGestureListener {
// 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发Java代码
@Override
public boolean onDown(MotionEvent arg0) {
System.out.println("onDown");
return false;
}
//用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
System.out.println("onFling");
String s="";
if (e1.getY() - e2.getY() > 30
&& Math.abs(velocityY) > 50) { //速度和距离都超过一定数值时才算滑动
// Fling up
s="上滑";
} else if (e2.getY() - e1.getY() >30
&& Math.abs(velocityY) > 50) {
// Fling down
s="下滑";
}
else
s="未定";
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
return false;
}
// 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
@Override
public void onLongPress(MotionEvent e) {
System.out.println("onLongPress");
}
// 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
System.out.println("onScroll");
return false;
}
// 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
// 注意和onDown()的区别,强调的是没有松开或者拖动的状态
@Override
public void onShowPress(MotionEvent e) {
System.out.println("onShowPress");
}
//用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
@Override
public boolean onSingleTapUp(MotionEvent e) {
System.out.println("onSingleTapUp");
return false;
}
}
点一下