美文网首页
Android 触摸事件分发

Android 触摸事件分发

作者: Passon_Fang | 来源:发表于2016-04-15 11:52 被阅读156次

触摸事件分发

几个重要的方法

  1. 触摸事件分发:定义在View

     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         return super.dispatchTouchEvent(ev);
     }
    
    • 这个方法一般不去处理。
    • 这个方法内部调用了事件打断和事件处理方法
    • 本次触摸事件中控件或者其子控件处理了事件就返回true
  1. 触摸事件打断:定义在ViewGroup

     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
         return super.onInterceptTouchEvent(ev);
     }
    
    • 打断触摸事件的传递(父控件收回子控件对触摸事件的处理权)
    • 不能打断自己处理的事件
    • 打断子控件对事件的处理的时候,子控件会调用action_cancel,子控件可能需要对这个事件进行处理
  2. 触摸事件处理:定义在View

     @Override
     public boolean onTouchEvent(MotionEvent event) {
         return super.onTouchEvent(event);
     }
    
    • 是否处理只在action_down时有效:如果在action_down的时候返回true表示它要处理本次所有的触摸事件
    • 内部调用onTouch(),如果用户实现了setOnTouchListener监听,它的返回值就是onTouchEvent的返回值

触摸事件处理(U型):事件从父控件-->子控件分发,事件处理从子控件-->父控件直到被处理;

事件冲突处理例子

SlidingPaneLayout布局里面子控件有ViewPager的时候,SlidingPaneLayout打断ViewPager的滑动事件处理

解决方案一:ViewPager添加setOnTouchListener

pager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // v就是viewpager
        ViewGroup parent = (ViewGroup) v.getParent();
        float x = event.getX();
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (x < parent.getWidth() / 5) { // 不要写定值
                parent.requestDisallowInterceptTouchEvent(false); // 打断,收回子控件对触摸事件的处理权,这个时候可以拉出SlidingPaneLayout
            } else {
                parent.requestDisallowInterceptTouchEvent(true); // 不被打断,滑动操作ViewPager
            }
        }
        return false;
    }
});

解决方案二:自定义SlidingPaneLayout

public class PagerAdapter extends android.support.v4.view.PagerAdapter {

    // 重写打断方法
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            flag = isOpen() || (ev.getX() < getWidth() / 5);
        }
        return flag && super.onInterceptTouchEvent(ev);
    }
}

相关文章

网友评论

      本文标题:Android 触摸事件分发

      本文链接:https://www.haomeiwen.com/subject/omlnlttx.html