2015-07-20 55 views
6

我正在使用Chris Bane的PhotoView在ViewPager中显示ImageViews。我想在用户放大图像时禁用ViewPager的滚动功能。我已经发现这个Hacky ViewPager可以通过调用toggleLock()来启用/禁用滚动。缩放监听器PhotoView

public class HackyViewPager extends ViewPager { 

    private boolean isLocked; 

    public HackyViewPager(Context context) { 
     super(context); 
     isLocked = false; 
    } 

    public HackyViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     isLocked = false; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     if (!isLocked) { 
      try { 
       return super.onInterceptTouchEvent(ev); 
      } 
      catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
       return false; 
      } 
     } 
     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return !isLocked && super.onTouchEvent(event); 
    } 

    public void toggleLock() { 
     isLocked = !isLocked; 
    } 

    public void setLocked(boolean isLocked) { 
     this.isLocked = isLocked; 
    } 

    public boolean isLocked() { 
     return isLocked; 
    } 

} 

所以我的问题是,我不知道在哪一点我必须致电toogleLock()。我想我必须实现一个听众,但我不确定哪一个会是最好的。预先感谢帮助我!

编辑:我想出了我自己的!

photoview.setOnMatrixChangeListener(new PhotoViewAttacher.OnMatrixChangedListener() { 
      @Override 
      public void onMatrixChanged(RectF rectF) { 
       if (photoview.getScale() > 1) { 
        sPager.setLocked(true); 
       } else { 
        sPager.setLocked(false); 
       } 
      } 
     }); 
+0

好的,伙计! 但请注意:检查photoview.getScale!= 1时,将会覆盖在scale == 1时的额外缩小。 我在ViewPager中使用它,它拦截了缩小。这一个应该做的伎俩。 – vchelbanster

回答

1

对于我,photoview.getScale() == 1总是和我使用缩放。

中的scaleFactor只是某个时间的刻度,与以前的值无关。我们需要计算累积scaleFactor

private float cumulScaleFactor = 1; 

photoViewAttacher.setOnScaleChangeListener(new PhotoViewAttacher.OnScaleChangeListener() { 
@Override 
public void onScaleChange(final float scaleFactor, final float focusX, final float focusY) { 
    cumulScaleFactor = cumulScaleFactor * scaleFactor; 

    sPager.setLocked(isValueApproximate(1.0f, cumulScaleFactor)); 
} 
}); 


private boolean isValueApproximate(final float expectedValue, final float value) { 
    final float errorMargin = 0.01f; 
    return Math.abs(expectedValue - value) < errorMargin; 
} 
0

而不是使用HackyViewPager的我设置photoview.setAllowParentInterceptOnEdge(真),当图片缩放= 1

photoView.setOnMatrixChangeListener(new PhotoViewAttacher.OnMatrixChangedListener() { 
    @Override 
    public void onMatrixChanged(RectF rect) { 
    photoView.setAllowParentInterceptOnEdge(photoView.getScale() == 1); 
    } 
});