Disable zoom/pan for built-in wallpapers

This commit is contained in:
Michael Jurka
2013-08-22 16:01:17 +02:00
parent 2b931429db
commit fbf25c19aa
2 changed files with 59 additions and 27 deletions

View File

@@ -17,12 +17,13 @@
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;
}
}
}

View 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();
}
}
};