1.单个view捕获触摸事件 除了通过覆写onTouchEvent()方法外,还可以通过setOnTouchListener()方法设置OnTouchListener监听器来监听相关的事件。 注意:如果设置的onTouchListener中 ACTION_DOWN 返回了false,那么后续就接收不到 ACTION_MOVE 和 ACTION_UP事件。
2.使用GestureDetectorCompat检测所有支持的手势 代码示例
public class MainActivity extends Activity implements
GestureDetector.OnGestureListener,
GestureDetector.OnDoubleTapListener{
private static final String DEBUG_TAG = "Gestures";
private GestureDetectorCompat mDetector;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDetector = new GestureDetectorCompat(this,this);
mDetector.setOnDoubleTapListener(this);
}
@Override
public boolean onTouchEvent(MotionEvent event){
this.mDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent event) {
Log.d(DEBUG_TAG,"onDown: " + event.toString());
return true;
}
@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
return true;
}
@Override
public void onLongPress(MotionEvent event) {
Log.d(DEBUG_TAG, "onLongPress: " + event.toString());
}
@Override
public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
float distanceY) {
Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString());
return true;
}
@Override
public void onShowPress(MotionEvent event) {
Log.d(DEBUG_TAG, "onShowPress: " + event.toString());
}
@Override
public boolean onSingleTapUp(MotionEvent event) {
Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());
return true;
}
@Override
public boolean onDoubleTap(MotionEvent event) {
Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent event) {
Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
return true;
}
}
3.检测所需要的事件 如果只是想检测部分关心的事件而不是所有的事件,则可以扩展GestureDetector.SimpleOnGestureListener类。该类implements了GestureDetector.OnGestureListener接口。 不管用GestureDetector.SimpleOnGestureListener还是GestureDetector.OnGestureListener来检测手势,onDown()方法最好返回true。因为一旦onDown()返回false,那么 系统会认为要忽略接下来的事件,那么其他方法就不会被调用。
4.因为基于手指触摸并不是一种非常精确的交互形式,所以检测触摸事件更多基于动作(movement),而不是简单的接触(contact)。所以为了区分移动手势(例如swipe)和非移动手势(例如single tap)。Android提出了touch slop的概念。
5.通过getHistorical方法可以获取触摸事件的位置、大小、时间、压力等。在绘制手指触摸路径时该方法非常有用(大概可以绘制那种移动尾部逐渐消失的效果)
6.记录触摸事件移动速度 代码示例
public class MainActivity extends Activity {
private static final String DEBUG_TAG = "Velocity";
...
private VelocityTracker mVelocityTracker = null;
@Override
public boolean onTouchEvent(MotionEvent event) {
int index = event.getActionIndex();
int action = event.getActionMasked();
int pointerId = event.getPointerId(index);
switch(action) {
case MotionEvent.ACTION_DOWN:
if(mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
else {
mVelocityTracker.clear();
}
mVelocityTracker.addMovement(event);
break;
case MotionEvent.ACTION_MOVE:
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(1000);
Log.d("", "X velocity: " +
VelocityTrackerCompat.getXVelocity(mVelocityTracker,
pointerId));
Log.d("", "Y velocity: " +
VelocityTrackerCompat.getYVelocity(mVelocityTracker,
pointerId));
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mVelocityTracker.recycle();
break;
}
return true;
}
}
7、滚动手势scroller Scrollers track scroll offsets for you over time, but they don’t automatically apply those positions to your view. It’s your responsibility to get and apply new coordinates at a rate that will make the scrolling animation look smooth. 滚动相关的术语: 当x与y轴上均有滚动时称之为panning。 Dragging,简单的dragging操作通常通过覆写 GestureDetector.OnGestureListener接口中的onScroll()方法实现。 Flinging,即用户拖拽并松开手指后滚动的状态,fling通常通过覆写GestureDetector.OnGestureListener接口中的onFling()方法实现。
|