android - PhotoView 的缩放监听器

标签 android imageview android-viewpager

我正在使用 Chris Bane 的 PhotoView在 ViewPager 中显示 ImageView。当用户放大图像时,我想禁用 ViewPager 的滚动。我已经找到了这个 Hacky ViewPager可用于通过调用 toggleLock() 来启用/禁用滚动。

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

最佳答案

对我来说,photoview.getScale() == 1 总是并且我使用缩放。

setOnScaleChangeListener中的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;
}

关于android - PhotoView 的缩放监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31523247/

相关文章:

java - 图像为空时数据未插入数据库

android - MapView 没有从 ViewPager 中删除?

android - ViewPager Items 的延迟加载数据

android - Xamarin 会帮助将 win32 DLL 移植到 android 共享库吗?

android - 迁移到 Jetpack 撰写错误 : Unbound symbols not allowed

android - 在 fragment 工具栏上放置一个搜索按钮,用于某个 Activity

java - 在 Python 服务器和 Android 客户端之间使用套接字操作

android Imageview layoutparams 在浸?

android - 将 ImageView 中的图像右对齐并垂直居中

android - 页面查看器中的 fragment 替换不适用于 API 21