自定义图像视图使棉花糖上的状态变松

时间:2019-03-10 13:04:32

标签: android imageview orientation-changes onsaveinstancestate onrestoreinstancestate

我正在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来演示此问题。请注意,我故意使用screenshot,因为目前我无法包含传递性androidx依赖。

1 个答案:

答案 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