【声明:】本文是作者(蘑菇v5)原创,版权归作者 蘑菇v5所有,侵权必究。本文首发在简书。如若转发,请注明作者和来源地址!未经授权,严禁私自转载!
需求是单击屏幕,出现
toolbar
。
需求效果图:
但是,由于是
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;
}
}