diff options
Diffstat (limited to 'src/com/android/gallery3d/filtershow/imageshow/ImageShow.java')
-rw-r--r-- | src/com/android/gallery3d/filtershow/imageshow/ImageShow.java | 311 |
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; + } + } |