【聲明:】本文是作者(蘑菇v5)原創,版權歸作者 蘑菇v5所有,侵權必究。本文首發在簡書。如若轉發,請注明作者和來源地址!未經授權,嚴禁私自轉載!
需求是單擊屏幕,出現
toolbar
。
需求效果圖:
點擊屏幕,出現toolbar.jpg
但是,由于是
fragment
中無法實現觸摸事件。這是因為fragment
和Activity
不一樣,沒有提供OnTouchEvent
函數。
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
思路:
通過在activity
中定義接口,fragment
中注冊或注銷觸摸事件,fragment
中實現接口方法,方法中返回手勢監聽的onTouchEvent(ev)
的布爾值
Activity
具體代碼:
過程:定義接口,接口列表,activity
的分發事件綁定給fragment
,注冊和注銷
//1.觸摸事件接口
public interface MyOnTouchListener {
public boolean onTouch(MotionEvent ev);
}
//2. 保存MyOnTouchListener接口的列表
private ArrayList<MyOnTouchListener> onTouchListeners = new ArrayList<MyOnTouchListener>();
//3.分發觸摸事件給所有注冊了MyOnTouchListener的接口
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
for (MyOnTouchListener listener : onTouchListeners) {
listener.onTouch(ev);
}
return super.dispatchTouchEvent(ev);
}
//4.提供給Fragment通過getActivity()方法來注冊自己的觸摸事件的方法
public void registerMyOnTouchListener(MyOnTouchListener myOnTouchListener) {
onTouchListeners.add(myOnTouchListener);
}
//5.提供給Fragment通過getActivity()方法來注銷自己的觸摸事件的方法
public void unregisterMyOnTouchListener(MyOnTouchListener myOnTouchListener) {
onTouchListeners.remove(myOnTouchListener);
}
可以把fragment
看成是Activity
中的一個子view
,所以,觸摸屏幕的時候,首先會觸發dispatchTouchEvent
函數,在這個函數里面為fragment
設置觸摸方法
具體事件機制請參見下文,很詳細:
http://www.cnblogs.com/linjzong/p/4191891.html
fragment
具體代碼:
過程:初始化監聽器,注冊和注銷,同時監聽器中監聽手勢動作
定義變量:
private GestureDetector mGestureDetector;
private SVCGestureListener mGestureListener = new SVCGestureListener();
在onCreateView
方法中:
mGestureDetector = new GestureDetector(getActivity(), mGestureListener);
mGestureDetector.setIsLongpressEnabled(true);
mGestureDetector.setOnDoubleTapListener(mGestureListener);
myOnTouchListener = new XXActivity.MyOnTouchListener() {
@Override
public boolean onTouch(MotionEvent ev) {
return mGestureDetector.onTouchEvent(ev);
}
};
((XXActivity)getActivity()).registerMyOnTouchListener(myOnTouchListener);
在onDestroy
方法中:
@Override
public void onDestroy() {
super.onDestroy();
((XXActivity) getActivity()).unregisterMyOnTouchListener(myOnTouchListener);
}
fragment
中其他代碼:
private static enum State{
VISIBLE,ANIMATIONING,INVISIBLE,
}
private State state = State.INVISIBLE;
public class SVCGestureListener implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
return false;
}
//點擊的時候執行
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// toolbar.changeVisibility();
if(state == State.VISIBLE) {
...
} else {
...
}
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
}