【问题标题】:How to zoom/pan image while inside a scrollview如何在滚动视图内缩放/平移图像
【发布时间】:2016-03-21 14:34:41
【问题描述】:

我正在使用一个 ViewPager,里面有一个 TouchImageView,它工作得很好,(我在我的许多 Android 应用程序中都使用了这个解决方案)。 但是,我有一个应用程序,在同一屏幕上有许多其他控件,因此它们都在滚动视图控件中。 在这种情况下,我看到滚动视图效果不佳,并且无法在缩放的图像中平移。当我用手指向上或向下平移时,整个页面滚动而不是图像平移。

所以这就是我想要做的...... 在 TouchImageView 中,我检测到 Zoom Begin 和 Zoom End,并创建了一个接口来回调我的 Activity onZoomBegin() 和 onZoomEnd() 方法。 在 onZoomBegin() 方法中,我想禁用滚动视图响应任何触摸事件,在 onZoomEnd() 中我可以重新启用它。 到目前为止,这是我在 onZoomBegin() 方法中尝试做的事情,但没有一个工作......

scrollView.setEnabled(false);
scrollView.requestDisallowInterceptTouchEvent(true);

我也尝试过类似问题的答案,即像这样接管 onTouchListener:

 scrollView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });

这确实会阻止滚动视图滚动,但滚动视图仍在拦截触摸事件,导致图像仍然不会向上或向下平移。

我已经尝试在布局设计器中检查nestedScrollingEnabled,不高兴...... 我只是想知道有没有办法完全禁用滚动视图,然后重新启用它以响应触摸事件?

【问题讨论】:

    标签: android scroll scrollview pan touchimageview


    【解决方案1】:

    我在某个地方的另一个问题上找到了这个答案,但是当我意识到这是我的问题的解决方案(我的问题的答案)时,我失去了对它的引用。我会继续寻找,以便我可以编辑这篇文章以在应得的地方给予信用。

    public class CustomScrollView extends ScrollView {
    
    // true if we can scroll the ScrollView
    // false if we cannot scroll
    private boolean scrollable = true;
    
    public CustomScrollView(Context context) {
        super(context);
    }
    
    public CustomScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    
    
    public void setScrollingEnabled(boolean scrollable) {
        this.scrollable = scrollable;
    }
    
    public boolean isScrollable() {
        return scrollable;
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // if we can scroll pass the event to the superclass
                if (scrollable)
                    return super.onTouchEvent(ev);
                // only continue to handle the touch event if scrolling enabled
                return false; // scrollable is always false at this point
            default:
                return super.onTouchEvent(ev);
        }
    }
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // Don't do anything with intercepted touch events if
        // we are not scrollable
        if (!scrollable)
            return false;
        else
            return super.onInterceptTouchEvent(ev);
    }
    

    }

    这部分是我自己想出来的……在 TouchImageView 中,我添加了一个回调接口,当缩放开始和结束时调用它,所以在我的 Activity 中我只需要这样做:

        private class OnZoomListener implements TouchImageView.OnZoomListener {
        @Override
        public void onZoomBegin() {
            isZoomed = true;
            scrollView.scrollTo(0, 0);
            scrollView.setScrollingEnabled(false); // <-- disables scrollview
            hideImageControls();
            sizeViewPager();
        }
    
        @Override
        public void onZoomEnd() {
            scrollView.setScrollingEnabled(true); // <-- enables scrollview
            showImageControls();
            isZoomed = false;
        }
    }
    

    【讨论】:

    • 你能发布你的 TouchImageView.java 类吗?因为我面临同样的问题。
    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多