android - 在 ViewPager/FrameLayout 下触摸缩放

标签 android imageview android-imageview android-framelayout pinchzoom

对于现在使用 Mike Ortiz's TouchImageView 的几个应用程序版本,我的双指缩放效果很好。和一个自定义 TouchViewPager,以便它可以在 View 寻呼机中工作。这工作得很好 - TouchViewPager 覆盖的唯一方法是 onInterceptTouchEvent :

public boolean onInterceptTouchEvent(MotionEvent ev) {
    TouchImageView view = getTouchView();
    if( null != view ){
        if( !view.isAtLimit() && view.getCurrentScale() > 1){
            return false;
        } else {
            Log.v(TAG, "View limit = " + view.isAtLimit());
            Log.v(TAG, "View scale = " + view.getCurrentScale());
        }
    }

    return super.onInterceptTouchEvent(ev);
}

最近,我们创建了一个扩展 FrameLayout 的新 View 并管理从互联网上下载位图。当位图下载正在进行时,此布局会显示 ProgressBar,然后在准备就绪后添加 TouchImageView。从视觉上看,这似乎可行——我们看到一个 ProgressBar,然后加载了 TouchImageView——但触摸变得一团糟,而且通常无法始终如一地工作。

我已经尝试将 onTouchEvent 从进度 ImageView 委托(delegate)给触摸 ImageView - 没有成功。我还尝试在进度 ImageView 中覆盖 onInterceptTouchEvent 以始终​​返回 false,但这也没有用。

任何人都可以提供一些关于在哪里继续调试此问题的想法吗?我已经为此工作了大约一个星期,但收效甚微。

这是我看到的行为:

  1. Activity 加载,图像在 ViewPager -> FrameLayout -> TouchImageView 中可见。

  2. ViewPager 可以滑动和更改图像,但双指缩放不能 处理第一张或第二张图片。最终你到达一个位置 捏缩放将起作用。我不知道有什么不同。

  3. 如果您确实尝试在滑动前捏合缩放,则 ViewPager 滑动将不起作用, 并且需要多次滑动才能让 ViewPager 进行分页。

  4. 一旦您处于“工作位置”,滑动到页面就可以正常工作,因为 以及捏缩放和平移缩放图像。在此之后所有职位都有效。

最佳答案

奇怪的是,我能够通过在 TouchImageView 类中实现重置方法来实现此功能:

public void resetZoom() {
    Matrix imageMatrix = getImageMatrix();
    RectF drawableRect = new RectF(0, 0, bmWidth, bmHeight);
    RectF viewRect = new RectF(0, 0, getWidth(), getHeight());

    imageMatrix.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER);

    matrix = imageMatrix;
    setImageMatrix(matrix);

    fitAndCenterView();

    invalidate();
}

此方法在调用时重置图像的缩放 - 当我们在 framelayout 中设置图像时,调用此方法可以设置所有内容。奇怪的是,当图像不在 FrameLayout 中时不需要这样做。

我当然会感谢任何代码清理以及我们可以做的其他事情。

关于android - 在 ViewPager/FrameLayout 下触摸缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12219934/

相关文章:

android - 如何在Imageview中获取图像的高度?

android - Imageview 中的并行动画

android - onSaveInstanceState 没有被调用

java - 我的应用程序在 android 9 版本中不断崩溃,抛出 java.lang.SecurityException

java - 如何在不丢失 x 和 y 布局坐标的情况下添加缩放功能

android - 如何在android中的触摸事件中获取图像点(或像素)的颜色

android - 使用 ViewPager + 放大 ImageViews 的图片库

java - 不幸的是,Android 应用程序已停止并可在 Android 设备上运行

android - SmsReceiver 适用于 API 21 及更早版本,但不适用于 API 26

android - ImageView 或 CardView 打开另一个 Activity onClick