OSDN Git Service

Disable zoom/pan for built-in wallpapers
authorMichael Jurka <mikejurka@google.com>
Thu, 22 Aug 2013 14:01:17 +0000 (16:01 +0200)
committerMichael Jurka <mikejurka@google.com>
Thu, 22 Aug 2013 14:01:17 +0000 (16:01 +0200)
src/com/android/launcher3/CropView.java
src/com/android/launcher3/WallpaperPickerActivity.java

index 5b49282..f904643 100644 (file)
 package com.android.launcher3;
 
 import android.content.Context;
-import android.graphics.Bitmap;
 import android.graphics.RectF;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.ScaleGestureDetector;
 import android.view.ScaleGestureDetector.OnScaleGestureListener;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 
 import com.android.photos.views.TiledImageRenderer.TileSource;
 import com.android.photos.views.TiledImageView;
@@ -32,6 +33,8 @@ public class CropView extends TiledImageView implements OnScaleGestureListener {
     private ScaleGestureDetector mScaleGestureDetector;
     private float mLastX, mLastY;
     private float mMinScale;
+    private boolean mTouchEnabled = true;
+    private RectF mTempEdges = new RectF();
 
     public CropView(Context context) {
         this(context, null);
@@ -42,7 +45,7 @@ public class CropView extends TiledImageView implements OnScaleGestureListener {
         mScaleGestureDetector = new ScaleGestureDetector(context, this);
     }
 
-    public RectF getCrop() {
+    private void getEdgesHelper(RectF edgesOut) {
         final float width = getWidth();
         final float height = getHeight();
         final float imageWidth = mRenderer.source.getImageWidth();
@@ -53,13 +56,25 @@ public class CropView extends TiledImageView implements OnScaleGestureListener {
         float centerY = (height / 2f - mRenderer.centerY + (imageHeight - height) / 2f)
                 * scale + height / 2f;
         float leftEdge = centerX - imageWidth / 2f * scale;
+        float rightEdge = centerX + imageWidth / 2f * scale;
         float topEdge = centerY - imageHeight / 2f * scale;
+        float bottomEdge = centerY + imageHeight / 2f * scale;
 
-        float cropLeft = -leftEdge / scale;
-        float cropTop = -topEdge / scale;
-        float cropRight = cropLeft + width / scale;
-        float cropBottom = cropTop + height / scale;
-        RectF cropRect = new RectF(cropLeft, cropTop, cropRight, cropBottom);
+        edgesOut.left = leftEdge;
+        edgesOut.right = rightEdge;
+        edgesOut.top = topEdge;
+        edgesOut.bottom = bottomEdge;
+    }
+
+    public RectF getCrop() {
+        final RectF edges = mTempEdges;
+        getEdgesHelper(edges);
+        final float scale = mRenderer.scale;
+
+        float cropLeft = -edges.left / scale;
+        float cropTop = -edges.top / scale;
+        float cropRight = cropLeft + getWidth() / scale;
+        float cropBottom = cropTop + getHeight() / scale;
 
         return new RectF(cropLeft, cropTop, cropRight, cropBottom);
     }
@@ -102,8 +117,32 @@ public class CropView extends TiledImageView implements OnScaleGestureListener {
     public void onScaleEnd(ScaleGestureDetector detector) {
     }
 
+    public void moveToUpperLeft() {
+        if (getWidth() == 0 || getHeight() == 0) {
+            final ViewTreeObserver observer = getViewTreeObserver();
+            observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+                    public void onGlobalLayout() {
+                        moveToUpperLeft();
+                        getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                    }
+                });
+        }
+        final RectF edges = mTempEdges;
+        getEdgesHelper(edges);
+        final float scale = mRenderer.scale;
+        mRenderer.centerX += Math.ceil(edges.left / scale);
+        mRenderer.centerY += Math.ceil(edges.top / scale);
+    }
+
+    public void setTouchEnabled(boolean enabled) {
+        mTouchEnabled = enabled;
+    }
+
     @Override
     public boolean onTouchEvent(MotionEvent event) {
+        if (!mTouchEnabled) {
+            return true;
+        }
         int action = event.getActionMasked();
         final boolean pointerUp = action == MotionEvent.ACTION_POINTER_UP;
         final int skipIndex = pointerUp ? event.getActionIndex() : -1;
@@ -133,30 +172,20 @@ public class CropView extends TiledImageView implements OnScaleGestureListener {
             if (mRenderer.source != null) {
                 // Adjust position so that the wallpaper covers the entire area
                 // of the screen
-                final float width = getWidth();
-                final float height = getHeight();
-                final float imageWidth = mRenderer.source.getImageWidth();
-                final float imageHeight = mRenderer.source.getImageHeight();
+                final RectF edges = mTempEdges;
+                getEdgesHelper(edges);
                 final float scale = mRenderer.scale;
-                float centerX = (width / 2f - mRenderer.centerX + (imageWidth - width) / 2f)
-                        * scale + width / 2f;
-                float centerY = (height / 2f - mRenderer.centerY + (imageHeight - height) / 2f)
-                        * scale + height / 2f;
-                float leftEdge = centerX - imageWidth / 2f * scale;
-                float rightEdge = centerX + imageWidth / 2f * scale;
-                float topEdge = centerY - imageHeight / 2f * scale;
-                float bottomEdge = centerY + imageHeight / 2f * scale;
-                if (leftEdge > 0) {
-                    mRenderer.centerX += Math.ceil(leftEdge / scale);
+                if (edges.left > 0) {
+                    mRenderer.centerX += Math.ceil(edges.left / scale);
                 }
-                if (rightEdge < getWidth()) {
-                    mRenderer.centerX += (rightEdge - getWidth()) / scale;
+                if (edges.right < getWidth()) {
+                    mRenderer.centerX += (edges.right - getWidth()) / scale;
                 }
-                if (topEdge > 0) {
-                    mRenderer.centerY += Math.ceil(topEdge / scale);
+                if (edges.top > 0) {
+                    mRenderer.centerY += Math.ceil(edges.top / scale);
                 }
-                if (bottomEdge < getHeight()) {
-                    mRenderer.centerY += (bottomEdge - getHeight()) / scale;
+                if (edges.bottom < getHeight()) {
+                    mRenderer.centerY += (edges.bottom - getHeight()) / scale;
                 }
             }
         }
index 0327421..7c84c7f 100644 (file)
@@ -95,9 +95,12 @@ public class WallpaperPickerActivity extends WallpaperCropActivity {
             } else if (meta.mGalleryImageUri != null) {
                 mCropView.setTileSource(new BitmapRegionTileSource(WallpaperPickerActivity.this,
                         meta.mGalleryImageUri, 1024, 0), null);
+                mCropView.setTouchEnabled(true);
             } else {
                 mCropView.setTileSource(new BitmapRegionTileSource(WallpaperPickerActivity.this,
                         meta.mWallpaperResId, 1024, 0), null);
+                mCropView.setTouchEnabled(false);
+                mCropView.moveToUpperLeft();
             }
         }
     };