OSDN Git Service

Improves swipe gesture
authornicolasroard <nicolasroard@google.com>
Fri, 19 Oct 2012 21:10:46 +0000 (14:10 -0700)
committernicolasroard <nicolasroard@google.com>
Fri, 19 Oct 2012 22:43:26 +0000 (15:43 -0700)
bug:7379463

- better timings
- add original label
- remove the gesture detector from ImageZoom (use the parent's one)

Change-Id: Ib6879e471dfc21cb3a112aa36a61cd304516cf7f

src/com/android/gallery3d/filtershow/FilterShowActivity.java
src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java

index a15a305..b8d74ac 100644 (file)
@@ -131,6 +131,9 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         // TODO: get those values from XML.
         ImageShow.setTextSize((int) getPixelsFromDip(12));
         ImageShow.setTextPadding((int) getPixelsFromDip(10));
+        ImageShow.setOriginalTextMargin((int) getPixelsFromDip(4));
+        ImageShow.setOriginalTextSize((int) getPixelsFromDip(18));
+        ImageShow.setOriginalText(getResources().getString(R.string.original_picture_text));
         ImageButtonTitle.setTextSize((int) getPixelsFromDip(12));
         ImageButtonTitle.setTextPadding((int) getPixelsFromDip(10));
         ImageSmallFilter.setMargin((int) getPixelsFromDip(3));
index 6a81fce..73dc598 100644 (file)
@@ -84,8 +84,16 @@ public class ImageShow extends View implements OnGestureListener,
 
     private boolean mTouchShowOriginal = false;
     private long mTouchShowOriginalDate = 0;
-    private final long mTouchShowOriginalDelay = 1000; // 1s
+    private final long mTouchShowOriginalDelayMin = 200; // 200ms
+    private final long mTouchShowOriginalDelayMax = 300; // 300ms
     private int mTouchDownX = 0;
+    private int mTouchDownY = 0;
+    protected float mTouchX = 0;
+    protected float mTouchY = 0;
+
+    private static int mOriginalTextMargin = 8;
+    private static int mOriginalTextSize = 26;
+    private static String mOriginalText = "Original";
 
     protected GeometryMetadata getGeometry() {
         return new GeometryMetadata(getImagePreset().mGeoData);
@@ -101,9 +109,6 @@ public class ImageShow extends View implements OnGestureListener,
     private boolean mShowToast = false;
     private boolean mImportantToast = false;
 
-    protected float mTouchX = 0;
-    protected float mTouchY = 0;
-
     private SeekBar mSeekBar = null;
     private PanelController mController = null;
 
@@ -121,6 +126,18 @@ public class ImageShow extends View implements OnGestureListener,
         mTextPadding = value;
     }
 
+    public static void setOriginalTextMargin(int value) {
+        mOriginalTextMargin = value;
+    }
+
+    public static void setOriginalTextSize(int value) {
+        mOriginalTextSize = value;
+    }
+
+    public static void setOriginalText(String text) {
+        mOriginalText = text;
+    }
+
     private final Handler mHandler = new Handler();
 
     public void select() {
@@ -404,18 +421,39 @@ public class ImageShow extends View implements OnGestureListener,
             return;
         canvas.save();
         if (image != null) {
-            int px = mTouchDownX - mImageBounds.left;
+            boolean goingDown = false;
+            if ((mTouchY - mTouchDownY) > (mTouchX - mTouchDownX)) {
+                goingDown = true;
+            }
+            int px = (int) (mTouchX - mImageBounds.left);
             int py = mImageBounds.height();
+            if (goingDown) {
+                px = mImageBounds.width();
+                py = (int) (mTouchY - mImageBounds.top);
+            }
             Rect d = new Rect(mImageBounds.left, mImageBounds.top,
                     mImageBounds.left + px, mImageBounds.top + py);
             canvas.clipRect(d);
+            drawImage(canvas, image);
             Paint paint = new Paint();
             paint.setColor(Color.BLACK);
-            canvas.drawLine(px, mImageBounds.top, px, mImageBounds.bottom, paint);
+            if (goingDown) {
+                canvas.drawLine(mImageBounds.left, mTouchY - 1,
+                        mImageBounds.right, mTouchY - 1, paint);
+            } else {
+                canvas.drawLine(mTouchX - 1, mImageBounds.top,
+                        mTouchX - 1, mImageBounds.bottom, paint);
+            }
+            Rect bounds = new Rect();
+            paint.setTextSize(mOriginalTextSize);
+            paint.getTextBounds(mOriginalText, 0, mOriginalText.length(), bounds);
+            paint.setColor(Color.BLACK);
+            canvas.drawText(mOriginalText, mImageBounds.left + mOriginalTextMargin + 1,
+                    mImageBounds.top + bounds.height() + mOriginalTextMargin + 1, paint);
             paint.setColor(Color.WHITE);
-            canvas.drawText("Original", mImageBounds.left, mImageBounds.top + 100, paint);
+            canvas.drawText(mOriginalText, mImageBounds.left + mOriginalTextMargin,
+                    mImageBounds.top + bounds.height() + mOriginalTextMargin, paint);
         }
-        drawImage(canvas, image);
         canvas.restore();
     }
 
@@ -537,20 +575,27 @@ public class ImageShow extends View implements OnGestureListener,
             mGestureDetector.onTouchEvent(event);
         }
         int ex = (int) event.getX();
+        int ey = (int) event.getY();
         if (event.getAction() == MotionEvent.ACTION_DOWN) {
             mTouchDownX = ex;
-            if (!mActivity.isShowingHistoryPanel() && mImageBounds != null
-                    && mImageBounds.left < ex && mImageBounds.right > ex) {
-                mTouchShowOriginal = true;
-                mTouchShowOriginalDate = System.currentTimeMillis();
-            }
+            mTouchDownY = ey;
+            mTouchShowOriginalDate = System.currentTimeMillis();
         }
         if (event.getAction() == MotionEvent.ACTION_MOVE) {
-            mTouchDownX = ex;
+            mTouchX = ex;
+            mTouchY = ey;
+            if (!mActivity.isShowingHistoryPanel()
+                    && (System.currentTimeMillis() - mTouchShowOriginalDate
+                          > mTouchShowOriginalDelayMin)) {
+                mTouchShowOriginal = true;
+            }
         }
         if (event.getAction() == MotionEvent.ACTION_UP) {
             mTouchShowOriginal = false;
             mTouchDownX = 0;
+            mTouchDownY = 0;
+            mTouchX = 0;
+            mTouchY = 0;
         }
         invalidate();
         return true;
@@ -656,8 +701,9 @@ public class ImageShow extends View implements OnGestureListener,
         if ((!mActivity.isShowingHistoryPanel() && startEvent.getX() > endEvent.getX())
                 || (mActivity.isShowingHistoryPanel() && endEvent.getX() > startEvent.getX())) {
             if (!mTouchShowOriginal
-                    || (mTouchShowOriginal
-                    && System.currentTimeMillis() - mTouchShowOriginalDate < mTouchShowOriginalDelay)) {
+                    || (mTouchShowOriginal &&
+                          (System.currentTimeMillis() - mTouchShowOriginalDate
+                                  < mTouchShowOriginalDelayMax))) {
                 mActivity.toggleHistoryPanel();
             }
         }
index a2b119c..4e2ccc3 100644 (file)
@@ -5,36 +5,19 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.util.AttributeSet;
-import android.view.GestureDetector;
-import android.view.GestureDetector.OnDoubleTapListener;
-import android.view.GestureDetector.OnGestureListener;
 import android.view.MotionEvent;
 
-public class ImageZoom extends ImageSlave implements OnGestureListener, OnDoubleTapListener {
+public class ImageZoom extends ImageSlave {
     private boolean mTouchDown = false;
     private boolean mZoomedIn = false;
     private Rect mZoomBounds = null;
-    private GestureDetector mGestureDetector = null;
 
     public ImageZoom(Context context) {
         super(context);
-        setupGestureDetector(context);
     }
 
     public ImageZoom(Context context, AttributeSet attrs) {
         super(context, attrs);
-        setupGestureDetector(context);
-    }
-
-    public void setupGestureDetector(Context context) {
-        mGestureDetector = new GestureDetector(context, this);
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        boolean ret = mGestureDetector.onTouchEvent(event);
-        ret = super.onTouchEvent(event);
-        return ret;
     }
 
     @Override
@@ -86,41 +69,6 @@ public class ImageZoom extends ImageSlave implements OnGestureListener, OnDouble
         drawToast(canvas);
     }
 
-    // TODO: move back some of that touch handling to a superclass / refactor
-    // SlideController into a more generic gesture detector
-    @Override
-    public boolean onDown(MotionEvent arg0) {
-        return false;
-    }
-
-    @Override
-    public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
-        return false;
-    }
-
-    @Override
-    public void onLongPress(MotionEvent arg0) {
-    }
-
-    @Override
-    public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
-        return false;
-    }
-
-    @Override
-    public void onShowPress(MotionEvent arg0) {
-    }
-
-    @Override
-    public boolean onSingleTapUp(MotionEvent arg0) {
-        return false;
-    }
-
-    @Override
-    public boolean onSingleTapConfirmed(MotionEvent arg0) {
-        return false;
-    }
-
     @Override
     public boolean onDoubleTap(MotionEvent event) {
 
@@ -133,9 +81,4 @@ public class ImageZoom extends ImageSlave implements OnGestureListener, OnDouble
         invalidate();
         return false;
     }
-
-    @Override
-    public boolean onDoubleTapEvent(MotionEvent arg0) {
-        return false;
-    }
 }
\ No newline at end of file