当ImageView被缩放时禁用ViewPager的分页功能

3

我使用了ViewPager进行图像滑动,我需要查看具有缩放选项的图像,图像被放大,但在缩放图像时分页会中断。尝试过onTouchEvent()OnInterceptTouchEvent()。禁用和启用ViewPager会导致强制关闭。


要禁用滚动,您必须使用自定义ViewPager类。 - Spring Breaker
4个回答

2

继承 ViewPager 并覆盖 canScroll() 方法。你将会获得检测到触摸事件的小部件,如果你想要滚动事件传递给该小部件,可以返回 true,如果你想要 ViewPager 使用该滚动量,则返回 false。在你的情况下,当你处于缩放状态时,你可以采用自己的定制逻辑,并在没有缩放时链接到超类。


由于我看到很多关于ViewPager-zoom组合的问题,我很惊讶竟然没有一个稳定的库来处理它,难道真的没有吗? 我看到了这篇文章: https://groups.google.com/forum/#!topic/android-developers/mygxOpYwcKo 但只有底部的两个项目使用了ViewPager,而且都存在这里描述的问题或稳定性问题。 无论如何,你Mark,或者你们中的任何人知道如何成功地结合ViewPager和缩放吗?谢谢。 - Rob
@Rob:考虑到ViewPager子类只有十几行代码,使用库似乎过于浪费。更糟糕的是,库不会事先知道需要缩放的内容,因此我甚至不知道如何实现这样的库。 - CommonsWare

2
我知道这个问题已经很老了,但是对于其他在寻找答案的人来说,Mike Ortiz TouchImageView可以直接使用(可能需要切换到开发分支)。

1
我曾经也遇到过同样的问题,我采用了自定义ViewPager类来解决。 CustomViewPager .java
public class CustomViewPager extends ViewPager {

    private boolean isPagingEnabled;

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

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

        return false;
    }

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

        return false;
    }

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

如果想要禁用滚动条,请使用以下代码片段:

CustomViewPager pager = (CustomViewPager) findViewById(R.id.pager);
pager.setPagingEnabled(false);

如果您需要更多信息,可以提出询问。希望能对您有所帮助。

代码可以运行,但是当我使用它时,我失去了在wiewpager中的滑动功能。谢谢! - benoffi7
@benoffi7:这段代码是用来禁用和启用分页的。你可以通过 pager.setPagingEnabled(boolean); 进行设置。 - Spring Breaker
1
谢谢!但是当我启用滑动时,当我停用缩放时呢? - benoffi7

0
我用以下方法实现了这个功能,它可以在用户缩放时禁用分页,但当用户到达缩放后的图像视图的边缘时,它会正确地翻页到下一张/上一张图片。
 @Override 
        public boolean onTouchEvent(MotionEvent ev) {
            if(handleTouch(ev)) {
                return super.onTouchEvent(ev);
            }
            else {
                return false;
            }

        }

        @Override 
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            if(handleTouch(ev) && !areCommentsOpen()) {
                return super.onInterceptTouchEvent(ev);
            }
            else {
                return false;
            }
        }

        private boolean handleTouch(MotionEvent ev) {
            if (prevX != -666 && ev.getAction() == MotionEvent.ACTION_MOVE) {
                if(ev.getX() <= prevX) {
                    isGoingLeft=false;
                }
                else {
                    isGoingLeft=true;
                }
            }
            else if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL) {
                return true;
            }

            ZoomableImageView imageView = getImageView();
            if(imageView == null) {
                return true;
            }
            prevX=ev.getX();
            if(imageView.getZoomLevel() <= 1f) {
                return true;
            }

            else if(imageView.isBoundedLeft()) {
                if(isTransitioning) {
                    return true;
                }
                else if (isGoingLeft) {
                    isTransitioning = true;
                    return true;
                }
                else {
                    return false;
                }
            }

            else if (imageView.isBoundedRight()) {
                if(isTransitioning) {
                    return true;
                }
                else if (!isGoingLeft) {
                    isTransitioning = true;
                    return true;
                }
                else {
                    return false;
                }
            }

            else {
                isTransitioning = false;
                return false;
            }
        }

private ZoomableImageView getImageView() {
        for (int i = 0; i < getChildCount(); i++) {
            ZoomableImageView imageView = (ZoomableImageView) (getChildAt(i).findViewById(R.id.single_image_view));
            if(imageView.getPosition() == getCurrentItem()) {
                return imageView;
            }
        }
        return null;
    }

    public void setTransitioning(boolean trans) {
        this.isTransitioning = trans;
    }

    public void setGoingLeft(boolean left) {
        this.isGoingLeft = left;
    }

这是位于自定义ViewPager类中的代码。因此,您将拥有class MyPager extends ViewPager { //上面的代码 }并且在您的xml中,您将拥有<com.your.package.path.MyPager /> - Damir Halilović

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接