简单的点击事件:
处理较复杂的点击事件:
新建一个类继承SimpleOnGestureListener,HahaGestureDetectorListener
可以实现以下event事件。
boolean onDoubleTap(MotionEvent e) 解释:双击的第二下Touch down时触发
boolean onDoubleTapEvent(MotionEvent e) 解释:双击的第二下Touch down和up都会触发,可用e.getAction()区分。
boolean onDown(MotionEvent e) 解释:Touch down时触发
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 解释:Touch了滑动一点距离后,up时触发。
void onLongPress(MotionEvent e) 解释:Touch了不移动一直Touch down时触发
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 解释:Touch了滑动时触发。
void onShowPress(MotionEvent e) 解释:Touch了还没有滑动时触发
(与onDown,onLongPress比较 onDown只要Touch down一定立刻触发。 而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。 所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。 )
boolean onSingleTapConfirmed(MotionEvent e)
boolean onSingleTapUp(MotionEvent e)
解释:上面这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发。
点击一下非常快的(不滑动)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
点击一下稍微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
2)在view的新建一个GestureDetector的对象。
构造函数里 gestureDetector = new GestureDetector(new HahaGestureDetectorListener());
然后在View的onTouchEvent里以下这样用,就可以在刚才1)弄的事件里写自己的代码了。
简单的例子:
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "---onTouchEvent action:ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "---onTouchEvent action:ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "---onTouchEvent action:ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL");
break;
}
return true;
}
处理较复杂的点击事件:
新建一个类继承SimpleOnGestureListener,HahaGestureDetectorListener
可以实现以下event事件。
boolean onDoubleTap(MotionEvent e) 解释:双击的第二下Touch down时触发
boolean onDoubleTapEvent(MotionEvent e) 解释:双击的第二下Touch down和up都会触发,可用e.getAction()区分。
boolean onDown(MotionEvent e) 解释:Touch down时触发
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 解释:Touch了滑动一点距离后,up时触发。
void onLongPress(MotionEvent e) 解释:Touch了不移动一直Touch down时触发
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 解释:Touch了滑动时触发。
void onShowPress(MotionEvent e) 解释:Touch了还没有滑动时触发
(与onDown,onLongPress比较 onDown只要Touch down一定立刻触发。 而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。 所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。 )
boolean onSingleTapConfirmed(MotionEvent e)
boolean onSingleTapUp(MotionEvent e)
解释:上面这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发。
点击一下非常快的(不滑动)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
点击一下稍微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
2)在view的新建一个GestureDetector的对象。
构造函数里 gestureDetector = new GestureDetector(new HahaGestureDetectorListener());
然后在View的onTouchEvent里以下这样用,就可以在刚才1)弄的事件里写自己的代码了。
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureScanner.onTouchEvent(event);
}
});
简单的例子:
public class touchGesture extends Activity implements OnGestureListener {
private LinearLayout main;
private TextView viewA;
private GestureDetector gestureScanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureScanner = new GestureDetector(this);
gestureScanner.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener(){
public boolean onDoubleTap(MotionEvent e) {
viewA.setText("-" + "onDoubleTap" + "-");
//双击时产生一次
Log.v("test", "onDoubleTap");
return false;
}
public boolean onDoubleTapEvent(MotionEvent e) {
//双击时产生两次
Log.v("test", "onDoubleTapEvent");
return false;
}
public boolean onSingleTapConfirmed(MotionEvent e) {
viewA.setText("-" + "onSingleTapConfirmed" + "-");
//短快的点击算一次单击
Log.v("test", "onSingleTapConfirmed");
return false;
}
});
main = new LinearLayout(this);
main.setBackgroundColor(Color.GRAY);
main.setLayoutParams(new LinearLayout.LayoutParams(320,480));
main.setOrientation(LinearLayout.VERTICAL);
viewA = new TextView(this);
viewA.setBackgroundColor(Color.YELLOW);
viewA.setTextColor(Color.BLACK);
viewA.setTextSize(16);
viewA.setLayoutParams(new LinearLayout.LayoutParams(320,50));
main.addView(viewA);
setContentView(main);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
//viewA.setText("-" + "DOWN" + "-");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//viewA.setText("-" + "FLING" + "- "+velocityX + "- "+velocityY);
Log.v("test", "onFling "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
//viewA.setText("-" + "LONG PRESS" + "-");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//viewA.setText("-" + "SCROLL" + "- "+distanceX + "- "+distanceY);
Log.v("test", "onScroll "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onShowPress(MotionEvent e) {
//viewA.setText("-" + "SHOW PRESS" + "-");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.v("test", "onSingleTapUp");
//viewA.setText("-" + "SINGLE TAP UP" + "-"+ i++);
return true;
}
}