詳談OnTouchListener與OnGestureListener的區(qū)別
Android事件處理機制是基于Listener實現(xiàn)的,比如觸摸屏相關(guān)的事件,是通過OnTouchListener實現(xiàn)的;而手勢是通過OnGestureListener實現(xiàn)的,那么這兩者有什么關(guān)聯(lián)呢?
OnTouchListener
OnTouchListener接口中包含一個onTouch()方法,直接看一個例子:
public class MainActivity extends Activity implements OnTouchListener {
public void onCreate(Bundle outState) {
super.onCreate(outState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setOnTouchListener(this);
}
public boolean onTouch(View v, MotionEvent event) {
Toast.makeText(this, "Touch Touch", Toast.LENGTH_SHORT).show();
return false ;
}
}
我們可以通過MotionEvent的getAction()方法來獲取Touch事件的類型,包括 ACTION_DOWN(按下觸摸屏), ACTION_MOVE(按下觸摸屏后移動受力點), ACTION_UP(松開觸摸屏)和ACTION_CANCEL(不會由用戶直接觸發(fā))。借助對于用戶不同操作的判斷,結(jié)合getRawX()、 getRawY()、getX()和getY()等方法來獲取坐標后,我們可以實現(xiàn)諸如拖動某一個按鈕,拖動滾動條等功能。
可以看到OnTouchListener只能監(jiān)聽到三種觸摸事件,即按下,移動,松開,如果想要監(jiān)聽到雙擊、滑動、長按等復(fù)雜的手勢操作,這個時候就必須得用到OnGestureListener了。
OnGestureListener
接著上面的例子,這次加入手勢監(jiān)聽:
public class MainActivity extends Activity implements OnTouchListener, OnGestureListener {
private GestureDetector mGestureDetector;
public void onCreate(Bundle outState) {
super.onCreate(outState);
setContentView(R.layout.main);
mGestureDetector = new GestureDetector(this);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setOnTouchListener(this);
}
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
// 用戶輕觸觸摸屏,由1個MotionEvent ACTION_DOWN觸發(fā)
public boolean onDown(MotionEvent arg0) {
Log.i("MyGesture", "onDown");
Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();
return true;
}
// 用戶輕觸觸摸屏,尚未松開或拖動,由一個1個MotionEvent ACTION_DOWN觸發(fā), 注意和onDown()的區(qū)別,強調(diào)的是沒有松開或者拖動的狀態(tài)
public void onShowPress(MotionEvent e) {
Log.i("MyGesture", "onShowPress");
Toast.makeText(this, "onShowPress", Toast.LENGTH_SHORT).show();
}
// 用戶(輕觸觸摸屏后)松開,由一個1個MotionEvent ACTION_UP觸發(fā)
public boolean onSingleTapUp(MotionEvent e) {
Log.i("MyGesture", "onSingleTapUp");
Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_SHORT).show();
return true;
}
// 用戶按下觸摸屏、快速移動后松開,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發(fā)
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.i("MyGesture", "onFling");
Toast.makeText(this, "onFling", Toast.LENGTH_LONG).show();
return true;
}
// 用戶按下觸摸屏,并拖動,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE觸發(fā)
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.i("MyGesture", "onScroll");
Toast.makeText(this, "onScroll", Toast.LENGTH_LONG).show();
return true;
}
// 用戶長按觸摸屏,由多個MotionEvent ACTION_DOWN觸發(fā)
public void onLongPress(MotionEvent e) {
Log.i("MyGesture", "onLongPress");
Toast.makeText(this, "onLongPress", Toast.LENGTH_LONG).show();
}
}
以上這篇詳談OnTouchListener與OnGestureListener的區(qū)別就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android ListView填充數(shù)據(jù)的方法
這篇文章主要介紹了Android ListView填充數(shù)據(jù)的方法的相關(guān)資料,大多數(shù)實現(xiàn)這樣的功能都是使用XML文件,這里就說下不使用布局文件如何實現(xiàn),需要的朋友可以參考下2017-09-09
Android?startActivityForResult的調(diào)用與封裝詳解
startActivityForResult?可以說是我們常用的一種操作了,目前有哪些方式實現(xiàn)?startActivityForResult?的功能呢?本文就來和大家詳細聊聊2023-03-03
Android 自定義可拖拽View界面渲染刷新后不會自動回到起始位置
這篇文章主要介紹了Android 自定義可拖拽View界面渲染刷新后不會自動回到起始位置的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02
使用ViewPager實現(xiàn)左右循環(huán)滑動及滑動跳轉(zhuǎn)
今天實現(xiàn)了左右滑動,至于在最后一頁滑動跳轉(zhuǎn),這個也做了但是效果不是太好,也希望有實現(xiàn)的朋友能夠分享下2013-01-01

