OSDN Git Service

Add scrolling support with a mouse wheel
authorOlivier Gay <ogay@logitech.com>
Fri, 12 Sep 2014 13:28:47 +0000 (15:28 +0200)
committerOlivier Gay <ogay@logitech.com>
Fri, 19 Sep 2014 22:59:26 +0000 (00:59 +0200)
When a physical mouse is connected, support scroll events
from the mouse when pictures are displayed. In film strip
view (full screen or not), both vertical and horizontal
scroll events have the same bevahior: pictures are
horizontally scrolled. In full screen, pictures are flinged.
When a picture is zoomed the scroll is done either
vertically or horizontally depending on user action.

Change-Id: Idb3b12b0ff86e8a590fa7f1a54111700db84e543
Signed-off-by: Olivier Gay <ogay@logitech.com>
src/com/android/camera/ui/FilmStripGestureRecognizer.java
src/com/android/camera/ui/FilmStripView.java

index e9ac1c7..6b65d30 100644 (file)
@@ -18,6 +18,8 @@ package com.android.camera.ui;
 
 import android.content.Context;
 import android.view.GestureDetector;
+import android.view.InputDevice;
+import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.ScaleGestureDetector;
 
@@ -31,6 +33,7 @@ public class FilmStripGestureRecognizer {
         boolean onSingleTapUp(float x, float y);
         boolean onDoubleTap(float x, float y);
         boolean onScroll(float x, float y, float dx, float dy);
+        boolean onMouseScroll(float hscroll, float vscroll);
         boolean onFling(float velocityX, float velocityY);
         boolean onScaleBegin(float focusX, float focusY);
         boolean onScale(float focusX, float focusY, float scale);
@@ -60,6 +63,23 @@ public class FilmStripGestureRecognizer {
         }
     }
 
+    public boolean onGenericMotionEvent(MotionEvent event) {
+        if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
+            switch (event.getAction()) {
+                case MotionEvent.ACTION_SCROLL: {
+                    final float hscroll = event.getAxisValue(MotionEvent.AXIS_HSCROLL);
+                    final float vscroll = -event.getAxisValue(MotionEvent.AXIS_VSCROLL);
+
+                    if (hscroll != 0.0f || vscroll != 0.0f) {
+                        mListener.onMouseScroll(hscroll, vscroll);
+                    }
+                }
+            }
+        }
+
+        return true;
+    }
+
     private class MyGestureListener
                 extends GestureDetector.SimpleOnGestureListener {
         @Override
index 6b2b7f5..095da75 100644 (file)
@@ -30,6 +30,7 @@ import android.net.Uri;
 import android.os.Handler;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
+import android.view.KeyEvent;
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.View;
@@ -64,6 +65,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
     // Only check for intercepting touch events within first 500ms
     private static final int SWIPE_TIME_OUT = 500;
     private static final int DECELERATION_FACTOR = 4;
+    private static final float MOUSE_SCROLL_FACTOR = 128f;
 
     private CameraActivity mActivity;
     private FilmStripGestureRecognizer mGestureRecognizer;
@@ -1806,6 +1808,12 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
         return true;
     }
 
+    @Override
+    public boolean onGenericMotionEvent(MotionEvent ev) {
+        mGestureRecognizer.onGenericMotionEvent(ev);
+        return true;
+    }
+
     private void updateViewItem(int itemID) {
         ViewItem item = mViewItem[itemID];
         if (item == null) {
@@ -2777,6 +2785,30 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
         }
 
         @Override
+        public boolean onMouseScroll(float hscroll, float vscroll) {
+            final float scroll;
+
+            hscroll *= MOUSE_SCROLL_FACTOR;
+            vscroll *= MOUSE_SCROLL_FACTOR;
+
+            if (vscroll != 0f) {
+                scroll = vscroll;
+            } else {
+                scroll = hscroll;
+            }
+
+            if (inFullScreen()) {
+                onFling(-scroll, 0f);
+            } else if (mController.isZoomStarted()) {
+                onScroll(0f, 0f, hscroll, vscroll);
+            } else {
+                onScroll(0f, 0f, scroll, 0f);
+            }
+
+            return true;
+        }
+
+        @Override
         public boolean onFling(float velocityX, float velocityY) {
             final ViewItem currItem = mViewItem[mCurrentItem];
             if (currItem == null) {