主要思路:通过对其父Activity的触摸事件的注册与取消注册来达到对该Fragment的手势监听。
效果图如下:
1、其父Activity主要代码如下:
public interface MyTouchListener { /** onTouchEvent的实现 */ boolean onTouchEvent(MotionEvent event); }
/** 保存MyTouchListener接口的列表 */ private ArrayList<MyTouchListener> myTouchListeners = new ArrayList<>(); /** 提供给Fragment通过getActivity()方法来注册自己的触摸事件的方法 */ public void registerMyTouchListener(MyTouchListener listener) { myTouchListeners.add(listener); } /** 提供给Fragment通过getActivity()方法来取消注册自己的触摸事件的方法 */ public void unRegisterMyTouchListener(MyTouchListener listener) { myTouchListeners.remove(listener); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { for (MyTouchListener listener : myTouchListeners) { listener.onTouchEvent(ev); } return super.dispatchTouchEvent(ev); }
2、该Fragment的主要代码如下:
@Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { View convertView = inflater.inflate(R.layout.fragment_relationcircle, container, false); /** 触摸事件的注册 */ ((MainActivity)this.getActivity()).registerMyTouchListener(myTouchListener); gestureDetector = new GestureDetector(mContext, myGestureListener); return convertView; } @Override public void onDestroy() { super.onDestroy(); /** 触摸事件的取消注册 */ ((MainActivity)this.getActivity()).unRegisterMyTouchListener(myTouchListener); }
/** * 自定义手势监听接口 */ class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e1.getY() - e2.getY() > 20) { FABtnWrite.setVisibility(View.GONE); } else if (e1.getY() - e2.getY() < 20) { FABtnWrite.setVisibility(View.VISIBLE); } return true; } }
/** 接收MainActivity的Touch回调的对象,重写其中的onTouchEvent函数 */ MainActivity.MyTouchListener myTouchListener = new MainActivity.MyTouchListener() { @Override public boolean onTouchEvent(MotionEvent event) { //处理手势事件(根据个人需要去返回和逻辑的处理) return gestureDetector.onTouchEvent(event); } };