0

我已经扩展了VerticalViewPager的一个版本,并向 viewpager添加了旋转过渡动画(使用android.graphics.Camera )。

getChildStaticTransformation 中应用的重要转换代码如下:

@Override
protected boolean getChildStaticTransformation(View child, Transformation t) {
    if (child.getHeight() == 0) {
        return false;
    }
    int childPosition = child.getTop() / child.getHeight();
    final boolean isFirstOrLast = childPosition == 0 || (childPosition == getAdapter().getCount() - 1);
    if (childPosition < 0) {
        return false;
    }
    if(isFirstOrLast && childOffsetVals[childPosition] == -1){
        childOffsetVals[childPosition] = 0;
    }
    int offFactor = 2;
    float dx = getWidth() / offFactor;
    int dy = getHeight() / offFactor;

    if (childOffsetVals[childPosition] > 0) {
        float rotateX = (ROTATION_FACTOR * childOffsetVals[childPosition]);
        float translateY = (TRANSLATION_FACTOR * childOffsetVals[childPosition]);
        t.getMatrix().reset();
        mCamera.save();
        mCamera.rotateX(rotateX);
        mCamera.translate(0, translateY, 0);
        mCamera.getMatrix(t.getMatrix());
        mCamera.restore();
        t.getMatrix().preTranslate(-dx, -(dy));
        t.getMatrix().postTranslate(dx, (dy));
    } else if (childOffsetVals[childPosition] < 0 && childOffsetVals[childPosition] > -1) {
        float rotateX = -(ROTATION_FACTOR * childOffsetVals[childPosition]);
        float translateY = -(TRANSLATION_FACTOR * childOffsetVals[childPosition]);
        t.getMatrix().reset();
        mCamera.save();
        mCamera.rotateX(rotateX);
        mCamera.translate(0, translateY, 0);
        mCamera.getMatrix(t.getMatrix());
        mCamera.restore();
        t.getMatrix().preTranslate(-dx, -(dy * offFactor));
        t.getMatrix().postTranslate(dx, (dy * offFactor));
    } 
    else {
        t.getMatrix().reset();
        mCamera.save();
        mCamera.rotateX(0);
        mCamera.getMatrix(t.getMatrix());
        mCamera.restore();
        t.getMatrix().preTranslate(-dx, -dy);
        t.getMatrix().postTranslate(dx, dy);
    }

    if (getChildCount() == 1) {
        this.invalidate();
    } else {
        child.invalidate();
    }
    return true;
}

在此行为的初始实现期间,viewpager 的每个片段仅包含一个带有随机颜色背景的简单视图。当转换旋转按要求运行时,我将简单的彩色视图替换为 web 视图(应用程序需要)并开始测试转换,只需将每个片段的 webview 加载到谷歌主页。当我这样做时,我开始在 viewpager 的转换过程中看到奇怪的行为,当页面经历旋转转换时,webview 的内容似乎在屏幕上转换的两个页面之间分裂,而每个页面布局的其余部分只显示背景webview(我设置为蓝色)。

下面是初始实现的转换的屏幕截图(仅使用彩色视图):

在此处输入图像描述

如您所见,蓝色页面正在向外滚动到顶部,绿色页面正在向内滚动,并且两者都应用了过渡旋转。这是正确的预期行为。

当我用加载谷歌主页的 webview 替换彩色视图时,下一个屏幕截图是从应用程序中截取的。正如我所提到的,每个页面中的 web 视图在转换期间没有显示视图的全部内容,而是显示我为背景设置的蓝色。

在此处输入图像描述

我在这个网站上做了很多搜索,试图找到过去有类似问题的人,但没有找到任何有用的东西。我真的很感谢这里的一些帮助,因为我对为什么会发生这种情况感到有点困惑,并且不能再花时间在这上面了。如果有人知道为什么 webview 会发生这种行为,这将很有用,因为它可能让我想出一个解决方案/解决方法。

我尝试了几种解决方法。一个我试图在滚动期间暂停 webview 并在之后重新启动它,另一个在滚动期间我用一个包含滚动开始时 webview 快照的 imageview 替换了 webview。这些解决方案似乎都不起作用。

我已经在这里上传了一个视频到 youtube,它更清楚地显示了 webview 滚动问题。

任何帮助/想法/提示将不胜感激。

4

1 回答 1

0

我担心问题出在 WebView 上,它与画布转换并不是真正的好朋友。您可以尝试拍摄 webview 的快照,并在滚动期间用快照替换 WebView。

于 2014-01-17T14:26:47.207 回答