android 事件攔截

主要思想是自定義被攔截的view,重寫dispatchTouchEvent這個方法,在這個方法裏寫攔截的規則。

例子請看下面的

 

public class InterceptViewPager extends ViewPager {

    private float    downX;
    private float    downY;

    public InterceptViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public InterceptViewPager(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        // 申請父控件不攔截事件
        getParent().requestDisallowInterceptTouchEvent(true);

        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            downX = ev.getX();
            downY = ev.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            System.out.println("movew...........");
            float moveX = ev.getX();
            float moveY = ev.getY();
            // 是否是橫向滑動

            float dx = moveX - downX;
            float dy = moveY - downY;
            if (Math.abs(dx) < Math.abs(dy)) {
                // 縱向滑動
                getParent().requestDisallowInterceptTouchEvent(false);// 攔截
            } else {
                // 申請父控件不攔截事件 條件
                // 1. 如果是第一張圖片,從左往右滑動 父類攔截我的事件
                if (getCurrentItem() == 0 && dx > 0) {

                    getParent().requestDisallowInterceptTouchEvent(false);// 攔截
                } else if (getCurrentItem() == getAdapter().getCount() - 1
                        && dx < 0) {
                    // 2. 最後一張圖片 從右往左滑動 父類攔截我的事件

                    getParent().requestDisallowInterceptTouchEvent(false);// 攔截
                } else {

                    // 3. 不攔截事件
                    getParent().requestDisallowInterceptTouchEvent(true);// 不攔截
                }
            }
            break;
        default:
            break;
        }

        return super.dispatchTouchEvent(ev);
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章