package be.digitalia.fosdem.widgets; import android.content.Context; import android.graphics.RectF; import android.os.Parcel; import android.os.Parcelable; import android.support.v4.os.ParcelableCompat; import android.support.v4.os.ParcelableCompatCreatorCallbacks; import android.util.AttributeSet; import android.view.ViewTreeObserver; import uk.co.senab.photoview.PhotoView; /** * PhotoView which saves and restores the current scale and approximate position. */ public class SaveStatePhotoView extends PhotoView { public SaveStatePhotoView(Context context) { super(context); } public SaveStatePhotoView(Context context, AttributeSet attr) { super(context, attr); } public SaveStatePhotoView(Context context, AttributeSet attr, int defStyle) { super(context, attr, defStyle); } @Override protected Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); SavedState ss = new SavedState(superState); ss.scale = getScale(); final RectF rect = getDisplayRect(); final float overflowWidth = rect.width() - getWidth(); if (overflowWidth > 0f) { ss.pivotX = -rect.left / overflowWidth; } final float overflowHeight = rect.height() - getHeight(); if (overflowHeight > 0f) { ss.pivotY = -rect.top / overflowHeight; } return ss; } @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() { @SuppressWarnings("deprecation") @Override public void onGlobalLayout() { float scale = Math.max(ss.scale, getMinimumScale()); scale = Math.min(scale, getMaximumScale()); setScale(scale, getWidth() * ss.pivotX, getHeight() * ss.pivotY, false); getViewTreeObserver().removeGlobalOnLayoutListener(this); } }); } public static class SavedState extends BaseSavedState { float scale = 1f; float pivotX = 0.5f; float pivotY = 0.5f; public SavedState(Parcelable superState) { super(superState); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeFloat(scale); out.writeFloat(pivotX); out.writeFloat(pivotY); } public static final Parcelable.Creator<SavedState> CREATOR = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks<SavedState>() { @Override public SavedState createFromParcel(Parcel in, ClassLoader loader) { return new SavedState(in); } @Override public SavedState[] newArray(int size) { return new SavedState[size]; } }); SavedState(Parcel in) { super(in); scale = in.readFloat(); pivotX = in.readFloat(); pivotY = in.readFloat(); } } }