2015-07-20 117 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); 
    } 
});