diff options
| author | Mihai Popa <popam@google.com> | 2018-07-19 15:50:43 +0100 |
|---|---|---|
| committer | Mihai Popa <popam@google.com> | 2018-08-29 11:16:26 +0100 |
| commit | beeaf5589d4fbd92038f1a6cd3aa4941cf884841 (patch) | |
| tree | 6fe2b5873f10c7265ebbb2bb9cc10d73242dcf09 /core/java/android/widget/Magnifier.java | |
| parent | c2e0bee9ea8596a181259df90a4d52dffeb5cb62 (diff) | |
[Magnifier-48] Allow on-the-fly zoom update
The CL adds Magnifier#setZoom(float), which allows dynamically changing
the initial zoom applied to the content that will be magnified and
displayed in the magnifier.
Bug: 72211470
Test: manual testing
Test: atest CtsWidgetTestCases:android.widget.cts.MagnifierTest
Change-Id: I1dd01085ef5a1589a3602aefd03223d1451564f5
Diffstat (limited to 'core/java/android/widget/Magnifier.java')
| -rw-r--r-- | core/java/android/widget/Magnifier.java | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java index f82b17f62b32..3280d477b23d 100644 --- a/core/java/android/widget/Magnifier.java +++ b/core/java/android/widget/Magnifier.java @@ -77,11 +77,13 @@ public final class Magnifier { // 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. @@ -196,7 +198,8 @@ public final class 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(), @@ -253,9 +256,16 @@ public final class Magnifier { 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); + } } } @@ -298,6 +308,18 @@ public final class Magnifier { } /** + * 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). @@ -534,6 +556,7 @@ public final class Magnifier { sPixelCopyHandlerThread.getThreadHandler()); mPrevStartCoordsInSurface.x = startXInSurface; mPrevStartCoordsInSurface.y = startYInSurface; + mDirtyZoom = false; } /** @@ -1020,6 +1043,21 @@ public final class Magnifier { } /** + * @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 |
