// The height of the window containing the magnifier.
private final int mWindowHeight;
// The zoom applied to the view region copied to the magnifier view.
- private final float mZoom;
+ private float mZoom;
// The width of the content that will be copied to the magnifier.
- private final int mSourceWidth;
+ private int mSourceWidth;
// The height of the content that will be copied to the magnifier.
- private final int mSourceHeight;
+ private int mSourceHeight;
+ // Whether the zoom of the magnifier has changed since last content copy.
+ private boolean mDirtyZoom;
// The elevation of the window containing the magnifier.
private final float mWindowElevation;
// The corner radius of the window containing the magnifier.
final int startX = mClampedCenterZoomCoords.x - mSourceWidth / 2;
final int startY = mClampedCenterZoomCoords.y - mSourceHeight / 2;
- if (sourceCenterX != mPrevShowSourceCoords.x || sourceCenterY != mPrevShowSourceCoords.y) {
+ if (sourceCenterX != mPrevShowSourceCoords.x || sourceCenterY != mPrevShowSourceCoords.y
+ || mDirtyZoom) {
if (mWindow == null) {
synchronized (mLock) {
mWindow = new InternalPopupWindow(mView.getContext(), mView.getDisplay(),
public void update() {
if (mWindow != null) {
obtainSurfaces();
- // Update the content shown in the magnifier.
- performPixelCopy(mPrevStartCoordsInSurface.x, mPrevStartCoordsInSurface.y,
- false /* update window position */);
+ if (!mDirtyZoom) {
+ // Update the content shown in the magnifier.
+ performPixelCopy(mPrevStartCoordsInSurface.x, mPrevStartCoordsInSurface.y,
+ false /* update window position */);
+ } else {
+ // If the zoom has changed, we cannot use the same top left coordinates
+ // as before, so just #show again to have them recomputed.
+ show(mPrevShowSourceCoords.x, mPrevShowSourceCoords.y,
+ mPrevShowWindowCoords.x, mPrevShowWindowCoords.y);
+ }
}
}
}
/**
+ * Sets the zoom to be applied to the chosen content before being copied to the magnifier popup.
+ * @param zoom the zoom to be set
+ */
+ public void setZoom(@FloatRange(from = 0f) float zoom) {
+ Preconditions.checkArgumentPositive(zoom, "Zoom should be positive");
+ mZoom = zoom;
+ mSourceWidth = Math.round(mWindowWidth / mZoom);
+ mSourceHeight = Math.round(mWindowHeight / mZoom);
+ mDirtyZoom = true;
+ }
+
+ /**
* Returns the zoom to be applied to the magnified view region copied to the magnifier.
* If the zoom is x and the magnifier window size is (width, height), the original size
* of the content being magnified will be (width / x, height / x).
sPixelCopyHandlerThread.getThreadHandler());
mPrevStartCoordsInSurface.x = startXInSurface;
mPrevStartCoordsInSurface.y = startYInSurface;
+ mDirtyZoom = false;
}
/**
}
/**
+ * @return the content to be magnified, as bitmap
+ *
+ * @hide
+ */
+ @TestApi
+ public @Nullable Bitmap getOriginalContent() {
+ if (mWindow == null) {
+ return null;
+ }
+ synchronized (mWindow.mLock) {
+ return Bitmap.createBitmap(mWindow.mBitmap);
+ }
+ }
+
+ /**
* @return the size of the magnifier window in dp
*
* @hide