ViewPager/FrameLayout下的触摸缩放

3

我已经使用Mike Ortiz的TouchImageView和自定义的TouchViewPager让应用程序在几个版本中非常好地支持了捏合缩放,以便它可以在视图页面内工作。这种方法效果很好 - 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并管理从互联网下载位图。当位图下载正在进行时,此布局显示ProgressBar,然后在准备就绪后添加TouchImageView。在视觉上,这似乎有效-我们看到ProgressBar,然后TouchImageView加载-但是触摸功能变得混乱,通常不能正常工作。
我已经尝试将进度图像视图的onTouchEvent委托给触摸图像视图-没有成功。我还尝试在进度图像视图中重写onInterceptTouchEvent以始终返回false,但也没有起作用。
有人可以帮忙提出一些继续调试此问题的想法吗?我已经在这个问题上工作了大约一周,但收效甚微。
这是我看到的行为:
  1. 活动加载时,图像可在ViewPager -> FrameLayout -> TouchImageView中看到。

  2. ViewPager工作以滑动和更改图像,但是第一或第二张图像无法捏合缩放。最终,您会到达一个可以进行捏合缩放的位置。我想不出有什么不同。

  3. 如果您在滑动之前尝试捏合缩放,则ViewPager的滑动将无法正常工作,并且需要多次滑动才能翻页。

  4. 一旦您处于“工作位置”,滑动翻页就可以正常工作,捏合缩放和平移缩放图像也可以正常工作。此后所有位置都可以工作。


如果您分享更多的代码可能会有所帮助。 - Benito Bertoli
дҪ зҡ„onInterceptTouchEvent()еҮҪж•°еҜ№жҲ‘еҮ д№Һе®ҢзҫҺең°иҝҗдҪң :) дҪ жҳҜеҰӮдҪ•е®һзҺ°isAtLimit()еҮҪж•°зҡ„пјҹ - Izydorr
我实际上不再使用那段代码了,但我向TouchImageView添加了getter方法来返回其limitX和limitY布尔值。那就是我当时正在检查的内容。 - Matthew Runo
1个回答

2
我能够通过在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中时,这不是必需的。

当然,我们可以进行任何代码清理等操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接