2015-07-20 4 views
6

Я использую PhotoView Chris Bane для отображения ImageViews в ViewPager. Я хочу отключить прокрутку 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(). Наверное, мне нужно реализовать слушателя, но я не уверен, какой из них был бы лучшим. Заранее спасибо за то, что помогли мне!

EDIT: Я понял это самостоятельно!

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 будет охватывать дополнительное масштабирование, когда оно уже находится в масштабе == 1. Я использовал это в ViewPager, и это перехватывало уменьшение. Это должно сделать трюк. – vchelbanster

ответ

1

Для меня photoview.getScale() == 1 всегда и я использую зум.

scaleFactor в setOnScaleChangeListener - это только шкала в определенное время независимо от предыдущего значения. Нам нужно рассчитать совокупный 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 (истинный), когда фото Scale = 1.

photoView.setOnMatrixChangeListener(new PhotoViewAttacher.OnMatrixChangedListener() { 
    @Override 
    public void onMatrixChanged(RectF rect) { 
    photoView.setAllowParentInterceptOnEdge(photoView.getScale() == 1); 
    } 
}); 
Смежные вопросы