我正在Android项目中使用PhotoView库。该项目包含SaveStatePhotoView,该simple project用于在配置更改(旋转,...)时保持图像视图的状态(缩放级别,位置)。
// SaveStatePhotoView.java
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
final SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
restoreSavedState(ss);
getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
}
该视图可以在Android 7.1.1和Android 9上正常工作。
在 Android 6.0.1 上,状态已丢失:旋转设备后,图像视图会重置为其初始状态。
我准备了PhotoView 1.3.1来演示此问题。请注意,我故意使用,因为目前我无法包含传递性androidx
依赖。
答案 0 :(得分:1)
NB 似乎不是 PhotoView 2.3.0版的问题。
为API 23及以下版本重新创建 PhotoView 时,会经历两种布局。对于API 24+,只有一次布局遍历。当有两遍通过时,将重置onRestoreInstanceState()
的{{1}}中恢复的标度(矩阵)。在您的代码中,您将在第一次遍历之后删除全局布局侦听器,因此,当矩阵在第二次遍历遍历上重置时,您将无法捕获它。对于API 24+,只有一遍,并且比例会恢复并且不会重置。这就是为什么您看到API 23而不是24的问题。
我认为真正的解决方法是在 PhotoView 中。香草SaveStatePhotoView
也要经过两次布局遍历,因此我认为 PhotoView 不会导致额外的布局遍历。不过,我确实认为 PhotoView 对某些API的缩放矩阵处理不当。
您可以通过执行以下操作来设置API 24+的第二遍缩放比例来解决此问题:
ImageView
以上内容基于提供的演示应用程序运行的 PhotoView 版本1.3.1