14

我正在使用 android 兼容性包版本 4 在我的应用程序中显示 pdf 页面。我使用 PagerAdapter 和 ViewPager 来显示 pdf 页面,如水平滚动视图。

现在问题出在与分页相关的东西上。我可以根据这个线程android: ViewPager 和 Horizo​​ntalScrollVIew通过检测 viewpager 内的子项来停止分页,但是当用户在该视图之外触摸时,我怎样才能启用它。我为 CustomViewPager 使用了以下代码。

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 中继续分页。

4

3 回答 3

3

我在分页需要缩放的图像文件时遇到了类似的问题。简单地说,需要一种在放大图像时禁用分页并在显示整个图像时启用它的方法。我像这样解决了它,并认为你可以做类似的事情。首先扩展:class MyViewPager extends 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 布局或从代码动态创建中使用您的视图寻呼机。

于 2013-05-23T13:15:00.427 回答
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

于 2013-08-02T16:00:14.697 回答
0

您将其设置为 false,但没有理由将其重置为 true。此外,您的拦截触摸逻辑似乎有点奇怪......您允许寻呼机拦截(并因此处理 in 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;
    }
于 2012-02-01T22:00:21.750 回答