ViewPager和放大器; ImageView的缩放问题放大器、缩放、问题、ViewPager

2023-09-05 06:06:44 作者:活像个孤独患者

我想实现使用ViewPager图像的画廊。此外,为了实现缩放功能是,我使用 TouchImageView 从github上。我也尝试过使用ZoomableImageView.

I am trying to implement a Gallery of images using ViewPager. Also, to implement zoom feature in that, I am using TouchImageView from github. I have also tried using ZoomableImageView.

不过,问题是,如果我缩放图像和放大器;如果我滚动的图像,然后,而不是图像, ViewPager 是越来越滚动和放大器; ViewPager 的下一个视图是越来越加载。

But, the problem is, if I zoom the image & if I scroll the image , then instead of image, ViewPager is getting scrolled & next view of ViewPager is getting loaded.

如果我放大的图像,然后,如果我滚动这一点,那么图像有移动 ViewPager

If I zoom the image then if I scroll that, then image has to move instead of ViewPager

ViewPager的下一个图只有加载,如果达到缩放图像的结束。那怎么办?

ViewPager's next view has to load only if reach the end of the zoomed image. How to do that?

我无法找到that.If我触摸并拖动对角线,只有图像是越来越移动图像。否则ViewPager的阻力是越来越调用。

I am not able to find that.If I touch & drag the image diagonally, only then image is getting moved. or else ViewPager's drag is getting invoked.

PS:这是不重复的。缩放完成。但问题是,图像缩放后。

ps: this is not duplicate. Zooming is done. But the problem is after image zooming.

推荐答案

是的,我也有同样的问题不TouchImageView。

Yes I too had the same problem not with TouchImageView.

太解决了我所做的是禁用ViewPager时,我的观点越来越关注的焦点问题。

Too solved the problem what i did is disabled the ViewPager when my view is getting the focus.

public class EnableDisableViewPager extends ViewPager {

    private boolean enabled = true;

    public EnableDisableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        if(enabled)
            return super.onInterceptTouchEvent(arg0);

        return false;
    }

    public boolean isEnabled() {
        return enabled;
    }

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

所以在TouchImageView实现你的监听器来触发事件是否其缩放或拖动。

so in TouchImageView implement your listener to trigger an event whether its zooming or dragging.

设置监听到你的活动视图对象。因此,当这些事件发生的只是禁止查看传呼机。

set listener to your view object in your Activity. So when those event occur just disable the view Pager.

注意:你还需要一个鼠标弹起事件,使viewpager

Note: you will also need a mouse up event to enable the viewpager.

EDITED

这将为变焦只工作,所以对于ViewPager刷卡,你应该放大到原来的页面。

This will work only for Zoom, so for ViewPager to swipe pages you should zoom back to original.

添加这些code您TouchImageView

Add these code to your TouchImageView

    public class TouchImageView extends ImageView {

        ...
    private TouchEventListener touchEventListener;

        private void sharedConstructing(Context context) {
            ...

            setOnTouchListener(new OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    ...
                        case MotionEvent.ACTION_UP:
                            ...
                            if(touchEventListener != null)
                            {
                                if(saveScale == 1.0)
                                    touchEventListener.onZoomToOriginal();
                                else
                                    touchEventListener.onZoom();
                            }
                            break;

                        ...
                    }
                    ...
                }

            });
        }

        ...

public TouchEventListener getTouchEventListener() {
        return touchEventListener;
    }

    public void setTouchEventListener(TouchEventListener touchEventListener) {
        this.touchEventListener = touchEventListener;
    }


        public interface TouchEventListener 
        {
            void onZoom();
            void onZoomToOriginal();
        }
    }

更好的解决方案

我们可以做到这一点,而不使用下面给出的方法延伸ViewPager到一个新的类。

We could achieve this without extending ViewPager to a new Class by using the method given below.

requestDisallowInterceptTouchEvent(true);

和与此,我们可以不刷卡缩小到原来的位置,因为我们的画廊和许多其他应用程序见。

And with this we could swipe without zooming out to original position as we see in Gallery and many other apps.

public class TouchImageView extends ImageView {

        ...
private void stopInterceptEvent()
{
    getParent().requestDisallowInterceptTouchEvent(true);
}

private void startInterceptEvent()
{
    getParent().requestDisallowInterceptTouchEvent(false);
}

private void sharedConstructing(Context context) {
    super.setClickable(true);
    this.context = context;
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    matrix.setTranslate(1f, 1f);
    m = new float[9];
    setImageMatrix(matrix);
    setScaleType(ScaleType.MATRIX);

    setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mScaleDetector.onTouchEvent(event);

            matrix.getValues(m);
            float x = m[Matrix.MTRANS_X];
            float y = m[Matrix.MTRANS_Y];
            PointF curr = new PointF(event.getX(), event.getY());

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    last.set(event.getX(), event.getY());
                    start.set(last);
                    mode = DRAG;
                    stopInterceptEvent();
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (mode == DRAG) {
                        float deltaX = curr.x - last.x;
                        float deltaY = curr.y - last.y;
                        float scaleWidth = Math.round(origWidth * saveScale);
                        float scaleHeight = Math.round(origHeight * saveScale);
                        if (scaleWidth < width) {
                            deltaX = 0;
                            if (y + deltaY > 0)
                                deltaY = -y;
                            else if (y + deltaY < -bottom)
                                deltaY = -(y + bottom); 
                        } else if (scaleHeight < height) {
                            deltaY = 0;
                            if (x + deltaX > 0)
                                deltaX = -x;
                            else if (x + deltaX < -right)
                                deltaX = -(x + right);
                        } else {
                            if (x + deltaX > 0)
                                deltaX = -x;
                            else if (x + deltaX < -right)
                                deltaX = -(x + right);

                            if (y + deltaY > 0)
                                deltaY = -y;
                            else if (y + deltaY < -bottom)
                                deltaY = -(y + bottom);
                        }

                        if(deltaX == 0)
                            startInterceptEvent();
                        else
                            stopInterceptEvent();

                        matrix.postTranslate(deltaX, deltaY);
                        last.set(curr.x, curr.y);
                    }
                    break;

                case MotionEvent.ACTION_UP:
                    mode = NONE;
                    int xDiff = (int) Math.abs(curr.x - start.x);
                    int yDiff = (int) Math.abs(curr.y - start.y);
                    if (xDiff < CLICK && yDiff < CLICK)
                        performClick();
                    startInterceptEvent();
                    break;

                case MotionEvent.ACTION_POINTER_UP:
                    mode = NONE;
                    break;
            }
            setImageMatrix(matrix);
            invalidate();
            return true; // indicate event was handled
        }

    });
}
}