Android 触摸ViewPager/FrameLayout下的缩放

Android 触摸ViewPager/FrameLayout下的缩放,android,imageview,android-imageview,android-framelayout,pinchzoom,Android,Imageview,Android Imageview,Android Framelayout,Pinchzoom,我不得不为一些现在使用的应用程序版本和一个定制的TouchViewPager进行缩放,这样它就可以在一个view pager中工作。这工作得很好-TouchViewPager覆盖的唯一方法是: 最近,我们创建了一个新视图,它扩展并管理从internet下载位图。位图下载过程中,此布局显示一个进度条,然后在准备就绪后添加TouchImageView。从视觉上看,这似乎是可行的——我们看到一个ProgressBar,然后加载TouchImageView——但是触摸会变得一团糟,而且通常不会持续工作

我不得不为一些现在使用的应用程序版本和一个定制的TouchViewPager进行缩放,这样它就可以在一个view pager中工作。这工作得很好-TouchViewPager覆盖的唯一方法是:

最近,我们创建了一个新视图,它扩展并管理从internet下载位图。位图下载过程中,此布局显示一个进度条,然后在准备就绪后添加TouchImageView。从视觉上看,这似乎是可行的——我们看到一个ProgressBar,然后加载TouchImageView——但是触摸会变得一团糟,而且通常不会持续工作

我尝试过将onTouchEvent从进度图像视图委托给触摸图像视图-运气不好。我还尝试在progress image视图中重写onInterceptTouchEvent以始终返回false,但这也不起作用

有没有人能提供一些关于在哪里继续调试这个问题的想法?我已经在这方面工作了大约一个星期,几乎没有成功

这就是我看到的行为:

  • 活动加载时,图像在ViewPager->FrameLayout->TouchImageView中可见

  • ViewPager可以滑动和更改图像,但收缩缩放不能 处理第一个或第二个图像。最终你得到了一个职位 那个收缩变焦可以用。我想不出有什么不同

  • 如果您在滑动前尝试收缩缩放,则ViewPager滑动将不起作用, 而且需要几次滑动才能将ViewPager切换到第页

  • 一旦您处于“工作位置”,轻扫页面即可正常工作,如下所示 以及围绕缩放图像进行收缩缩放和平移。在这之后,所有的职位都工作了


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


    当然,我非常感谢任何代码清理以及我们所能做的任何事情。

    如果您共享更多的代码,可能会有所帮助。您的
    onInterceptTouchEvent()
    函数对我来说几乎非常好:)您是如何实现
    isAtLimit()
    函数的?我实际上不再使用该代码了,但我在TouchImageView中添加了getter以返回limitX和limitY布尔值。这就是我要检查的。
    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();
    }