Android:fragment中如何处理onTouchEvent触摸事件

【声明:】本文是作者(蘑菇v5)原创,版权归作者 蘑菇v5所有,侵权必究。本文首发在。如若转发,请注明作者和来源地址!未经授权,严禁私自转载!

需求是单击屏幕,出现toolbar

需求效果图:

Android:fragment中如何处理onTouchEvent触摸事件_第1张图片
点击屏幕,出现toolbar.jpg

但是,由于是 fragment中无法实现触摸事件。这是因为 fragmentActivity不一样,没有提供 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 onTouchListeners = new ArrayList();
    //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;
        }
    }

你可能感兴趣的:(Android:fragment中如何处理onTouchEvent触摸事件)