summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/filtershow/imageshow/ImageShow.java')
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/ImageShow.java311
1 files changed, 163 insertions, 148 deletions
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
index 463756839..39e0cc82b 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
@@ -17,38 +17,28 @@
package com.android.gallery3d.filtershow.imageshow;
import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.RectF;
+import android.graphics.*;
import android.net.Uri;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
-import android.view.GestureDetector;
+import android.view.*;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
-import android.view.MotionEvent;
-import android.view.View;
import android.widget.LinearLayout;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
import com.android.gallery3d.filtershow.FilterShowActivity;
import com.android.gallery3d.filtershow.PanelController;
import com.android.gallery3d.filtershow.cache.ImageLoader;
+import com.android.gallery3d.filtershow.cache.RenderingRequestCaller;
import com.android.gallery3d.filtershow.filters.ImageFilter;
import com.android.gallery3d.filtershow.presets.ImagePreset;
-import com.android.gallery3d.filtershow.ui.SliderListener;
import java.io.File;
public class ImageShow extends View implements OnGestureListener,
- OnDoubleTapListener,
- SliderListener,
- OnSeekBarChangeListener {
+ ScaleGestureDetector.OnScaleGestureListener,
+ OnDoubleTapListener {
private static final String LOGTAG = "ImageShow";
@@ -64,9 +54,10 @@ public class ImageShow extends View implements OnGestureListener,
private static int mBackgroundColor = Color.RED;
private GestureDetector mGestureDetector = null;
+ private ScaleGestureDetector mScaleGestureDetector = null;
protected Rect mImageBounds = new Rect();
-
+ private boolean mOriginalDisabled = false;
private boolean mTouchShowOriginal = false;
private long mTouchShowOriginalDate = 0;
private final long mTouchShowOriginalDelayMin = 200; // 200ms
@@ -75,10 +66,9 @@ public class ImageShow extends View implements OnGestureListener,
private static int UNVEIL_HORIZONTAL = 1;
private static int UNVEIL_VERTICAL = 2;
- private int mTouchDownX = 0;
- private int mTouchDownY = 0;
- protected float mTouchX = 0;
- protected float mTouchY = 0;
+ private Point mTouchDown = new Point();
+ private Point mTouch = new Point();
+ private boolean mFinishedScalingOperation = false;
private static int mOriginalTextMargin = 8;
private static int mOriginalTextSize = 26;
@@ -88,16 +78,10 @@ public class ImageShow extends View implements OnGestureListener,
return new GeometryMetadata(getImagePreset().mGeoData);
}
- public void setGeometry(GeometryMetadata d) {
- getImagePreset().mGeoData.set(d);
- }
-
- private boolean mShowControls = false;
private String mToast = null;
private boolean mShowToast = false;
private boolean mImportantToast = false;
- private SeekBar mSeekBar = null;
private PanelController mController = null;
private FilterShowActivity mActivity = null;
@@ -137,30 +121,9 @@ public class ImageShow extends View implements OnGestureListener,
private final Handler mHandler = new Handler();
public void select() {
- if (mSeekBar != null) {
- mSeekBar.setOnSeekBarChangeListener(this);
- }
- }
-
- private int parameterToUI(int parameter, int minp, int maxp, int uimax) {
- return (uimax * (parameter - minp)) / (maxp - minp);
- }
-
- private int uiToParameter(int ui, int minp, int maxp, int uimax) {
- return ((maxp - minp) * ui) / uimax + minp;
- }
-
- public void updateSeekBar(int parameter, int minp, int maxp) {
- if (mSeekBar == null) {
- return;
- }
- int seekMax = mSeekBar.getMax();
- int progress = parameterToUI(parameter, minp, maxp, seekMax);
- mSeekBar.setProgress(progress);
}
public void unselect() {
-
}
public boolean hasModifications() {
@@ -182,7 +145,6 @@ public class ImageShow extends View implements OnGestureListener,
return mController;
}
- @Override
public void onNewValue(int parameter) {
if (getImagePreset() != null) {
getImagePreset().fillImageStateAdapter(MasterImage.getImage().getState());
@@ -194,15 +156,8 @@ public class ImageShow extends View implements OnGestureListener,
mActivity.enableSave(hasModifications());
}
- @Override
- public void onTouchDown(float x, float y) {
- mTouchX = x;
- mTouchY = y;
- invalidate();
- }
-
- @Override
- public void onTouchUp() {
+ public Point getTouchPoint() {
+ return mTouch;
}
public ImageShow(Context context, AttributeSet attrs) {
@@ -223,6 +178,7 @@ public class ImageShow extends View implements OnGestureListener,
public void setupGestureDetector(Context context) {
mGestureDetector = new GestureDetector(context, this);
+ mScaleGestureDetector = new ScaleGestureDetector(context, this);
}
@Override
@@ -232,10 +188,6 @@ public class ImageShow extends View implements OnGestureListener,
setMeasuredDimension(parentWidth, parentHeight);
}
- public void setSeekBar(SeekBar seekBar) {
- mSeekBar = seekBar;
- }
-
public ImageFilter getCurrentFilter() {
return MasterImage.getImage().getCurrentFilter();
}
@@ -269,6 +221,42 @@ public class ImageShow extends View implements OnGestureListener,
return GeometryMath.roundNearest(getImagePreset().mGeoData.getPreviewCropBounds());
}
+ /* consider moving the following 2 methods into a subclass */
+ /**
+ * This function calculates a Image to Screen Transformation matrix
+ *
+ * @param reflectRotation set true if you want the rotation encoded
+ * @return Image to Screen transformation matrix
+ */
+ protected Matrix getImageToScreenMatrix(boolean reflectRotation) {
+ GeometryMetadata geo = getImagePreset().mGeoData;
+ if (geo == null || mImageLoader == null
+ || mImageLoader.getOriginalBounds() == null) {
+ return new Matrix();
+ }
+ Matrix m = geo.getOriginalToScreen(reflectRotation,
+ mImageLoader.getOriginalBounds().width(),
+ mImageLoader.getOriginalBounds().height(), getWidth(), getHeight());
+ Point translate = MasterImage.getImage().getTranslation();
+ float scaleFactor = MasterImage.getImage().getScaleFactor();
+ m.postTranslate(translate.x, translate.y);
+ m.postScale(scaleFactor, scaleFactor, getWidth()/2.0f, getHeight()/2.0f);
+ return m;
+ }
+
+ /**
+ * This function calculates a to Screen Image Transformation matrix
+ *
+ * @param reflectRotation set true if you want the rotation encoded
+ * @return Screen to Image transformation matrix
+ */
+ protected Matrix getScreenToImageMatrix(boolean reflectRotation) {
+ Matrix m = getImageToScreenMatrix(reflectRotation);
+ Matrix invert = new Matrix();
+ m.invert(invert);
+ return invert;
+ }
+
public Rect getDisplayedImageBounds() {
return mImageBounds;
}
@@ -308,8 +296,18 @@ public class ImageShow extends View implements OnGestureListener,
@Override
public void onDraw(Canvas canvas) {
+ MasterImage.getImage().setImageShowSize(getWidth(), getHeight());
+ canvas.save();
+ // TODO: center scale on gesture
+ float cx = canvas.getWidth()/2.0f;
+ float cy = canvas.getHeight()/2.0f;
+ float scaleFactor = MasterImage.getImage().getScaleFactor();
+ Point translation = MasterImage.getImage().getTranslation();
+ canvas.scale(scaleFactor, scaleFactor, cx, cy);
+ canvas.translate(translation.x, translation.y);
drawBackground(canvas);
defaultDrawImage(canvas);
+ canvas.restore();
if (showTitle() && getImagePreset() != null) {
mPaint.setARGB(200, 0, 0, 0);
@@ -322,6 +320,12 @@ public class ImageShow extends View implements OnGestureListener,
1.5f * mTextPadding, mPaint);
}
+ Bitmap partialPreview = MasterImage.getImage().getPartialImage();
+ if (partialPreview != null) {
+ Rect src = new Rect(0, 0, partialPreview.getWidth(), partialPreview.getHeight());
+ Rect dest = new Rect(0, 0, getWidth(), getHeight());
+ canvas.drawBitmap(partialPreview, src, dest, mPaint);
+ }
drawToast(canvas);
}
@@ -370,7 +374,7 @@ public class ImageShow extends View implements OnGestureListener,
canvas.save();
if (image != null) {
if (mShowOriginalDirection == 0) {
- if ((mTouchY - mTouchDownY) > (mTouchX - mTouchDownX)) {
+ if ((mTouch.y - mTouchDown.y) > (mTouch.x - mTouchDown.x)) {
mShowOriginalDirection = UNVEIL_VERTICAL;
} else {
mShowOriginalDirection = UNVEIL_HORIZONTAL;
@@ -381,9 +385,9 @@ public class ImageShow extends View implements OnGestureListener,
int py = 0;
if (mShowOriginalDirection == UNVEIL_VERTICAL) {
px = mImageBounds.width();
- py = (int) (mTouchY - mImageBounds.top);
+ py = (int) (mTouch.y - mImageBounds.top);
} else {
- px = (int) (mTouchX - mImageBounds.left);
+ px = (int) (mTouch.x - mImageBounds.left);
py = mImageBounds.height();
}
@@ -395,11 +399,11 @@ public class ImageShow extends View implements OnGestureListener,
paint.setColor(Color.BLACK);
if (mShowOriginalDirection == UNVEIL_VERTICAL) {
- canvas.drawLine(mImageBounds.left, mTouchY - 1,
- mImageBounds.right, mTouchY - 1, paint);
+ canvas.drawLine(mImageBounds.left, mTouch.y - 1,
+ mImageBounds.right, mTouch.y - 1, paint);
} else {
- canvas.drawLine(mTouchX - 1, mImageBounds.top,
- mTouchX - 1, mImageBounds.bottom, paint);
+ canvas.drawLine(mTouch.x - 1, mImageBounds.top,
+ mTouch.x - 1, mImageBounds.bottom, paint);
}
Rect bounds = new Rect();
@@ -435,34 +439,10 @@ public class ImageShow extends View implements OnGestureListener,
}
}
- public ImageShow setShowControls(boolean value) {
- mShowControls = value;
- if (mShowControls) {
- if (mSeekBar != null) {
- mSeekBar.setVisibility(View.VISIBLE);
- }
- } else {
- if (mSeekBar != null) {
- mSeekBar.setVisibility(View.INVISIBLE);
- }
- }
- return this;
- }
-
- public boolean showControls() {
- return mShowControls;
- }
-
- public boolean showHires() {
- return true;
- }
-
public boolean showTitle() {
return false;
}
-
-
public void setImageLoader(ImageLoader loader) {
mImageLoader = loader;
if (mImageLoader != null) {
@@ -531,35 +511,73 @@ public class ImageShow extends View implements OnGestureListener,
mImageLoader.returnFilteredResult(getImagePreset(), filterShowActivity);
}
+ public boolean scaleInProgress() {
+ return mScaleGestureDetector.isInProgress();
+ }
+
+ protected boolean isOriginalDisabled() {
+ return mOriginalDisabled;
+ }
+
+ protected void setOriginalDisabled(boolean originalDisabled) {
+ mOriginalDisabled = originalDisabled;
+ }
+
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
- if (mGestureDetector != null) {
- mGestureDetector.onTouchEvent(event);
+ mGestureDetector.onTouchEvent(event);
+ boolean scaleInProgress = scaleInProgress();
+ mScaleGestureDetector.onTouchEvent(event);
+ if (!scaleInProgress() && scaleInProgress) {
+ // If we were scaling, the scale will stop but we will
+ // still issue an ACTION_UP. Let the subclasses know.
+ mFinishedScalingOperation = true;
}
+
int ex = (int) event.getX();
int ey = (int) event.getY();
if (event.getAction() == MotionEvent.ACTION_DOWN) {
- mTouchDownX = ex;
- mTouchDownY = ey;
+ mTouchDown.x = ex;
+ mTouchDown.y = ey;
mTouchShowOriginalDate = System.currentTimeMillis();
mShowOriginalDirection = 0;
+ MasterImage.getImage().setOriginalTranslation(MasterImage.getImage().getTranslation());
}
+
if (event.getAction() == MotionEvent.ACTION_MOVE) {
- mTouchX = ex;
- mTouchY = ey;
- if (!mActivity.isShowingHistoryPanel()
+ mTouch.x = ex;
+ mTouch.y = ey;
+
+ if (event.getPointerCount() == 2) {
+ float scaleFactor = MasterImage.getImage().getScaleFactor();
+ if (scaleFactor >= 1) {
+ float translateX = (mTouch.x - mTouchDown.x) / scaleFactor;
+ float translateY = (mTouch.y - mTouchDown.y) / scaleFactor;
+ Point originalTranslation = MasterImage.getImage().getOriginalTranslation();
+ Point translation = MasterImage.getImage().getTranslation();
+ translation.x = (int) (originalTranslation.x + translateX);
+ translation.y = (int) (originalTranslation.y + translateY);
+ MasterImage.getImage().setTranslation(translation);
+ }
+ } else if (!mOriginalDisabled && !mActivity.isShowingHistoryPanel()
&& (System.currentTimeMillis() - mTouchShowOriginalDate
- > mTouchShowOriginalDelayMin)) {
+ > mTouchShowOriginalDelayMin)
+ && event.getPointerCount() == 1) {
mTouchShowOriginal = true;
}
}
+
if (event.getAction() == MotionEvent.ACTION_UP) {
mTouchShowOriginal = false;
- mTouchDownX = 0;
- mTouchDownY = 0;
- mTouchX = 0;
- mTouchY = 0;
+ mTouchDown.x = 0;
+ mTouchDown.y = 0;
+ mTouch.x = 0;
+ mTouch.y = 0;
+ if (MasterImage.getImage().getScaleFactor() <= 1) {
+ MasterImage.getImage().setScaleFactor(1);
+ MasterImage.getImage().resetTranslation();
+ }
}
invalidate();
return true;
@@ -570,48 +588,6 @@ public class ImageShow extends View implements OnGestureListener,
invalidate();
}
- public float getImageRotation() {
- return getImagePreset().mGeoData.getRotation();
- }
-
- public float getImageRotationZoomFactor() {
- return getImagePreset().mGeoData.getScaleFactor();
- }
-
- public void setImageRotation(float r) {
- getImagePreset().mGeoData.setRotation(r);
- }
-
- public void setImageRotationZoomFactor(float f) {
- getImagePreset().mGeoData.setScaleFactor(f);
- }
-
- public void setImageRotation(float imageRotation,
- float imageRotationZoomFactor) {
- float r = getImageRotation();
- if (imageRotation != r) {
- invalidate();
- }
- setImageRotation(imageRotation);
- setImageRotationZoomFactor(imageRotationZoomFactor);
- }
-
- @Override
- public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) {
- int parameter = progress;
- onNewValue(parameter);
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar arg0) {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar arg0) {
- // TODO Auto-generated method stub
- }
-
@Override
public boolean onDoubleTap(MotionEvent arg0) {
// TODO Auto-generated method stub
@@ -638,13 +614,17 @@ public class ImageShow extends View implements OnGestureListener,
@Override
public boolean onFling(MotionEvent startEvent, MotionEvent endEvent, float arg2, float arg3) {
+ if (mActivity == null) {
+ return false;
+ }
if ((!mActivity.isShowingHistoryPanel() && startEvent.getX() > endEvent.getX())
|| (mActivity.isShowingHistoryPanel() && endEvent.getX() > startEvent.getX())) {
if (!mTouchShowOriginal
|| (mTouchShowOriginal &&
(System.currentTimeMillis() - mTouchShowOriginalDate
< mTouchShowOriginalDelayMax))) {
- mActivity.toggleHistoryPanel();
+ // TODO fix gesture.
+ // mActivity.toggleHistoryPanel();
}
}
return true;
@@ -673,11 +653,46 @@ public class ImageShow extends View implements OnGestureListener,
}
public boolean useUtilityPanel() {
- return false;
+ return true;
}
public void openUtilityPanel(final LinearLayout accessoryViewList) {
// TODO Auto-generated method stub
}
+ @Override
+ public boolean onScale(ScaleGestureDetector detector) {
+ float scaleFactor = MasterImage.getImage().getScaleFactor();
+ scaleFactor = scaleFactor * detector.getScaleFactor();
+ if (scaleFactor > 2) {
+ scaleFactor = 2;
+ }
+ if (scaleFactor < 0.5) {
+ scaleFactor = 0.5f;
+ }
+ MasterImage.getImage().setScaleFactor(scaleFactor);
+ return true;
+ }
+
+ @Override
+ public boolean onScaleBegin(ScaleGestureDetector detector) {
+ return true;
+ }
+
+ @Override
+ public void onScaleEnd(ScaleGestureDetector detector) {
+ if (MasterImage.getImage().getScaleFactor() < 1) {
+ MasterImage.getImage().setScaleFactor(1);
+ invalidate();
+ }
+ }
+
+ public boolean didFinishScalingOperation() {
+ if (mFinishedScalingOperation) {
+ mFinishedScalingOperation = false;
+ return true;
+ }
+ return false;
+ }
+
}