禁用&在Android中的ViewPager中启用分页

时间:2011-11-15 09:48:24

标签: android android-viewpager

我使用Android兼容包版本4在我的应用程序中显示pdf页面。 我使用过PagerAdapter& ViewPager用于显示水平滚动视图等pdf页面。

现在问题在于分页相关的东西。我能够通过根据这个线程android: ViewPager and HorizontalScrollVIew检测viewpager中的子节点来停止分页,但是当用户触摸到该视图之外时,我该如何才能启用它。我使用了以下CodeViewPager代码。

public class CustomViewPager extends ViewPager {

        private boolean enabled;
        private int childId;

        public CustomViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.enabled = true;
        }

        public void setChildId(int childId) {
            this.childId = childId;
        }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            boolean result = false;
            View scroll = getChildAt(childId);
            if (scroll != null) {
                Rect rect = new Rect();
                CommonLogic.logMessage("PDF Page Rectangle  ", TAG, Log.VERBOSE);
                scroll.getHitRect(rect);
                if (rect.contains((int) event.getX(), (int) event.getY())) {
                    setPagingEnabled(false);
                    result = true;
                }
            }
            return result;
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (this.enabled) {
                return super.onTouchEvent(event);
            }
            return false;
        }

        public void setPagingEnabled(boolean enabled) {
            this.enabled = enabled;
        }
    }

当尝试在pdf页面外触摸时,if(scroll!=null)在两个方向都变为真。

任何人都可以帮我解决如何启用它,以便在ViewPager中继续分页。

3 个答案:

答案 0 :(得分:3)

我遇到了与需要捏缩放的分页图像文件类似的问题。简单地说,需要一种方法来在图像放大时禁用分页,并在显示整个图像时启用它。我这样解决了,认为你可以做类似的事情。 首先扩展:类MyViewPager扩展ViewPager {...} 然后在该类中覆盖以下两个方法

    @Override
public boolean onTouchEvent(MotionEvent event) {
    if (YOUR_CRITERIA_TOENABLE_DISABLE) {
        return true;

    } else {
        return super.onTouchEvent(event);
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return super.onInterceptTouchEvent(event);
}

请务必在xml布局中使用视图寻呼机或从代码中动态创建。

答案 1 :(得分:1)

@Override
public boolean onTouchEvent(MotionEvent event) {
     if (this.enabled) {
           return super.onTouchEvent(event);
     }
     return false;
}

public void setPagingEnabled(boolean enabled) {
    this.enabled = enabled;
}

将“return false”替换为“return this.enable”并将this.enable的默认值设置为false

答案 2 :(得分:0)

您将其设置为false,但无法将其重置为true。此外,你的拦截触摸逻辑看起来有点奇怪...你只允许寻呼机拦截(从而在onTouchEvent()中进行处理)是你将寻呼设置为false时。以下怎么样?

 @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        boolean result = true;
        View scroll = getChildAt(childId);
        if (scroll != null) {
            Rect rect = new Rect();
            CommonLogic.logMessage("PDF Page Rectangle  ", TAG, Log.VERBOSE);
            scroll.getHitRect(rect);
            if (rect.contains((int) event.getX(), (int) event.getY())) {
                setPagingEnabled(false);
                result = false;
            } else {
                setPagingEnabled(true);
            }
        }
        return result;
    }