From fa85c84f2ae41198caadf6bcc890186dbaf3af4b Mon Sep 17 00:00:00 2001 From: Olivier Gay Date: Fri, 12 Sep 2014 15:28:47 +0200 Subject: [PATCH] Add scrolling support with a mouse wheel 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 --- .../camera/ui/FilmStripGestureRecognizer.java | 20 ++++++++++++++ src/com/android/camera/ui/FilmStripView.java | 32 ++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/com/android/camera/ui/FilmStripGestureRecognizer.java b/src/com/android/camera/ui/FilmStripGestureRecognizer.java index e9ac1c76e..6b65d304c 100644 --- a/src/com/android/camera/ui/FilmStripGestureRecognizer.java +++ b/src/com/android/camera/ui/FilmStripGestureRecognizer.java @@ -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 diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java index 6b2b7f5e0..095da75ad 100644 --- a/src/com/android/camera/ui/FilmStripView.java +++ b/src/com/android/camera/ui/FilmStripView.java @@ -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) { -- 2.11.0