我已经扩展了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 滚动问题。
任何帮助/想法/提示将不胜感激。