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并管理从 Internet 下载位图的新视图。在位图下载过程中,此布局显示一个 ProgressBar,然后在准备好后添加 TouchImageView。从视觉上看,这似乎可行——我们看到一个 ProgressBar,然后加载了 TouchImageView——但触摸变得一团糟,而且通常不能始终如一地工作。

我尝试将 onTouchEvent 从进度图像视图委托给触摸图像视图 - 不走运。我还尝试在进度图像视图中覆盖 onInterceptTouchEvent 以始终​​返回 false,但这也不起作用。

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

这是我看到的行为:

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

  2. ViewPager 可以滑动和更改图像,但捏缩放不适用于第一张或第二张图像。最终你会到达一个可以使用捏缩放的位置。我无法弄清楚有什么不同。

  3. 如果您确实尝试在滑动之前捏缩放,那么 ViewPager 滑动将不起作用,并且需要多次滑动才能使 ViewPager 进入页面。

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

4

1 回答 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 中时,这不是必需的。

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

于 2012-09-04T16:37:36.513 回答