2015-07-20 22 views
6

Tôi đang sử dụng PhotoView của Chris Bane để hiển thị ImageViews trong ViewPager. Tôi muốn tắt tính năng cuộn của ViewPager khi người dùng đã phóng to hình ảnh. Tôi đã tìm thấy điều này Hacky ViewPager có thể được sử dụng để bật/tắt tính năng cuộn bằng cách gọi toggleLock().Trình nghe thu phóng cho 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; 
    } 

} 

Vì vậy, vấn đề của tôi ở đây là tôi không chắc chắn vào thời điểm nào tôi phải gọi toogleLock(). Tôi đoán tôi phải thực hiện một người nghe, nhưng tôi không chắc người nghe nào là người giỏi nhất. Cảm ơn trước vì đã giúp tôi!

EDIT: Tôi đã tự mình tìm ra!

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

Tốt nhất, người đàn ông! Một lưu ý: mặc dù: kiểm tra photoview.getScale! = 1 sẽ bao gồm thu phóng thêm khi đã ở tỷ lệ == 1. Tôi đã sử dụng tính năng này trong ViewPager và nó đã chặn việc thu nhỏ. Điều này nên làm các trick. – vchelbanster

Trả lời

1

Đối với tôi, photoview.getScale() == 1 luôn và tôi sử dụng chức năng thu phóng.

scaleFactor trong setOnScaleChangeListener chỉ là tỷ lệ tại thời điểm nhất định độc lập với giá trị trước đó. Chúng ta cần tính toán số tích lũy 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

Thay vì sử dụng HackyViewPager tôi đặt photoview.setAllowParentInterceptOnEdge (true), khi ảnh Scale = 1.

photoView.setOnMatrixChangeListener(new PhotoViewAttacher.OnMatrixChangedListener() { 
    @Override 
    public void onMatrixChanged(RectF rect) { 
    photoView.setAllowParentInterceptOnEdge(photoView.getScale() == 1); 
    } 
}); 
Các vấn đề liên quan