非应用开发,所以对基本控件理解比较浅显。高手略过。
Gesture,即手势,基于touch事件。理论上说通过截获onTouch事件也是可以实现的,但封装了这个类后,相当于系统会帮你去计算这次touch是做了什么事情,只是touchdown了一下,还是fling了,或是scroll了。写了一个简单demo便于理解。
public class MainActivity extends AppCompatActivity { private static final String TAG = "AndroidDemo"; private Button mClick; private LinearLayout mLayout = null; private TextView mTv = null; private GestureDetector mGesture = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "Android Demo onCreate"); createViewByCode(); mGesture = new GestureDetector(this, new MyGestureDetector()); } private void createViewByCode() { mLayout = new LinearLayout(this); mLayout.setLayoutParams(new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mLayout.setOrientation(LinearLayout.VERTICAL); mTv = new TextView(this); mTv.setText("Hello code"); mTv.setTextSize(19); LayoutParams params = new LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mLayout.addView(mTv, params); setContentView(mLayout); } @Override public boolean onTouchEvent(MotionEvent event) { Log.d(TAG, "activity onTouchEvent"); mGesture.onTouchEvent(event); return super.onTouchEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.d(TAG, "activity dispatchTouchEvent"); return super.dispatchTouchEvent(ev); } class MyGestureDetector extends GestureDetector.SimpleOnGestureListener{ @Override public boolean onDown(MotionEvent e) { Log.d(TAG, "MyGestureDetector onDown x=" + e.getRawX() + ", y=" + e.getRawY()); return super.onDown(e); } @Override public void onShowPress(MotionEvent e) { Log.d(TAG, "MyGestureDetector onShowPress x=" + e.getRawX() + ", y=" + e.getRawY()); super.onShowPress(e); } @Override public boolean onSingleTapUp(MotionEvent e) { Log.d(TAG, "MyGestureDetector onSingleTapUp x=" + e.getRawX() + ", y=" + e.getRawY()); return super.onSingleTapUp(e); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.d(TAG, "MyGestureDetector onScroll distanceX=" + distanceX + ", distanceY=" + distanceY); return super.onScroll(e1, e2, distanceX, distanceY); } @Override public void onLongPress(MotionEvent e) { Log.d(TAG, "MyGestureDetector onLongPress "); super.onLongPress(e); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.d(TAG, "MyGestureDetector onFling velocityX=" + velocityX + ", velocityY=" + velocityY); return super.onFling(e1, e2, velocityX, velocityY); } } }
使用的是GestureDetector类,官方文档的解释是
/**
* Detects various gestures and events using the supplied {@link MotionEvent}s.
* The {@link OnGestureListener} callback will notify users when a particular
* motion event has occurred. This class should only be used with {@link MotionEvent}s
* reported via touch (don't use for trackball events).
*/
即特定的手势产生时,就会notify使用者,即回调。
它有两个listener接口,OnGestureListener和OnDoubleTapListener。如果你直接使用这两个接口,就要全部实现它。所以就有了一个简单地空实现,SimpleOnGestureListener,只需要你实现你需要的部分就可以了。
具体的回调有:
按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress): 手指按在持续一段时间,并且没有松开。
滚动(onScroll): 手指在触摸屏上滑动。
按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
抬起(onSingleTapUp):手指离开触摸屏的那一刹那
你需要哪个动作,就Override哪个callback就可以了。
如何使用呢?
GestureDetector也是基于MotionEvent的,所以要在activity/viewgroup/view的onTouchEvent回调中调用GestureDetector.onTouchEvent()。如上面的代码中
@Override public boolean onTouchEvent(MotionEvent event) { Log.d(TAG, "activity onTouchEvent"); mGesture.onTouchEvent(event); return super.onTouchEvent(event); }