如何在滚动视图内缩放/平移图像

时间:2016-03-21 14:34:41

标签: android scroll scrollview pan touchimageview

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

所以这就是我要做的...... 在TouchImageView内部,我检测到Zoom Begin和Zoom End,并创建了一个接口,用于回调我的Activity onZoomBegin()和onZoomEnd()方法。 在onZoomBegin()方法中,我想禁用scrollview来响应任何触摸事件,在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,没有快乐.... 我只是想知道有没有办法完全禁用scrollview,然后重新启用它来响应触摸事件?

1 个答案:

答案 0 :(得分:0)

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

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;
    }
}