Loading res/values/dimens.xml +3 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,9 @@ <dimen name="pie_touch_slop">12dp</dimen> <dimen name="pie_touch_offset">40dp</dimen> <dimen name="pie_view_size">48dp</dimen> <dimen name="pie_arc_offset">48dp</dimen> <dimen name="pie_item_radius">206dp</dimen> <dimen name="pie_arc_radius">362dp</dimen> <dimen name="focus_radius_offset">8dp</dimen> <dimen name="focus_inner_offset">24dp</dimen> <dimen name="focus_outer_stroke">3dp</dimen> Loading src/com/android/camera/PhotoMenu.java +31 −14 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ public class PhotoMenu extends PieController TimerSettingPopup.Listener, ListPrefSettingPopup.Listener { private static String TAG = "CAM_photomenu"; private static float FLOAT_PI_DIVIDED_BY_TWO = (float) Math.PI / 2; private final String mSettingOff; private PhotoUI mUI; Loading @@ -54,13 +53,20 @@ public class PhotoMenu extends PieController super.initialize(group); mPopup = null; mSecondPopup = null; float sweep = FLOAT_PI_DIVIDED_BY_TWO / 2; addItem(CameraSettings.KEY_FLASH_MODE, FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep); addItem(CameraSettings.KEY_EXPOSURE, 3 * FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep); addItem(CameraSettings.KEY_WHITE_BALANCE, 3 * FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep); float sweep = (float) (SWEEP * Math.PI); PieItem item = null; // flash if (group.findPreference(CameraSettings.KEY_FLASH_MODE) != null) { item = makeItem(CameraSettings.KEY_FLASH_MODE, CENTER - sweep, sweep); mRenderer.addItem(item); } // exposure compensation item = makeItem(CameraSettings.KEY_EXPOSURE, CENTER + sweep, sweep); mRenderer.addItem(item); // camera switcher if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) { PieItem item = makeItem(R.drawable.ic_switch_photo_facing_holo_light); item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep); item = makeItem(R.drawable.ic_switch_photo_facing_holo_light); item.setFixedSlice(CENTER - 2 * sweep, sweep); item.setOnClickListener(new OnClickListener() { @Override public void onClick(PieItem item) { Loading @@ -79,10 +85,11 @@ public class PhotoMenu extends PieController }); mRenderer.addItem(item); } // hdr if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) { PieItem hdr = makeItem(R.drawable.ic_hdr); hdr.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO, sweep); hdr.setOnClickListener(new OnClickListener() { item = makeItem(R.drawable.ic_hdr); item.setFixedSlice(CENTER + 2 * sweep, sweep); item.setOnClickListener(new OnClickListener() { @Override public void onClick(PieItem item) { // Find the index of next camera. Loading @@ -96,8 +103,18 @@ public class PhotoMenu extends PieController } } }); mRenderer.addItem(hdr); mRenderer.addItem(item); } // more settings PieItem more = makeItem(R.drawable.ic_settings_holo_light); more.setFixedSlice(CENTER, sweep); mRenderer.addItem(more); // white balance item = makeItem(CameraSettings.KEY_WHITE_BALANCE, CENTER + sweep, sweep); more.addItem(item); // settings popup mOtherKeys = new String[] { CameraSettings.KEY_SCENE_MODE, CameraSettings.KEY_RECORD_LOCATION, Loading @@ -106,8 +123,8 @@ public class PhotoMenu extends PieController CameraSettings.KEY_TIMER, CameraSettings.KEY_TIMER_SOUND_EFFECTS, }; PieItem item = makeItem(R.drawable.ic_settings_holo_light); item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO * 3, sweep); item = makeItem(R.drawable.ic_settings_holo_light); item.setFixedSlice(CENTER, sweep); item.setOnClickListener(new OnClickListener() { @Override public void onClick(PieItem item) { Loading @@ -117,7 +134,7 @@ public class PhotoMenu extends PieController mUI.showPopup(mPopup); } }); mRenderer.addItem(item); more.addItem(item); } @Override Loading src/com/android/camera/PhotoUI.java +23 −10 Original line number Diff line number Diff line Loading @@ -56,7 +56,8 @@ public class PhotoUI implements PieListener, PreviewGestures.SingleTapListener, FocusUI, LocationManager.Listener, FaceDetectionListener { FaceDetectionListener, PreviewGestures.SwipeListener { private static final String TAG = "CAM_UI"; Loading Loading @@ -175,7 +176,8 @@ public class PhotoUI implements PieListener, } if (mGestures == null) { // this will handle gesture disambiguation and dispatching mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer); mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer, this); } mGestures.clearTouchReceivers(); mGestures.setRenderOverlay(mRenderOverlay); Loading @@ -196,12 +198,7 @@ public class PhotoUI implements PieListener, updateOnScreenIndicators(params, prefs); } public void initializeControlByIntent() { mBlocker = mActivity.findViewById(R.id.blocker); mMenuButton = mActivity.findViewById(R.id.menu); mMenuButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { private void openMenu() { if (mPieRenderer != null) { // If autofocus is not finished, cancel autofocus so that the // subsequent touch can be handled by PreviewGestures Loading @@ -211,6 +208,15 @@ public class PhotoUI implements PieListener, mPieRenderer.showInCenter(); } } public void initializeControlByIntent() { mBlocker = mActivity.findViewById(R.id.blocker); mMenuButton = mActivity.findViewById(R.id.menu); mMenuButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { openMenu(); } }); if (mController.isImageCaptureIntent()) { mActivity.hideSwitcher(); Loading Loading @@ -723,4 +729,11 @@ public class PhotoUI implements PieListener, mFaceView.setFaces(faces); } @Override public void onSwipe(int direction) { if (direction == PreviewGestures.DIR_UP) { openMenu(); } } } src/com/android/camera/PieController.java +24 −3 Original line number Diff line number Diff line Loading @@ -37,6 +37,10 @@ public class PieController { protected static final int MODE_PHOTO = 0; protected static final int MODE_VIDEO = 1; protected static float CENTER = (float) Math.PI / 2; protected static final float SWEEP = 0.06f; protected CameraActivity mActivity; protected PreferenceGroup mPreferenceGroup; protected OnPreferenceChangedListener mListener; Loading Loading @@ -84,10 +88,10 @@ public class PieController { return new PieItem(drawable, 0); } public void addItem(String prefKey, float center, float sweep) { public PieItem makeItem(String prefKey, float center, float sweep) { final IconListPreference pref = (IconListPreference) mPreferenceGroup.findPreference(prefKey); if (pref == null) return; if (pref == null) return null; int[] iconIds = pref.getLargeIconIds(); int resid = -1; if (!pref.getUseSingleIcon() && iconIds != null) { Loading @@ -101,7 +105,6 @@ public class PieController { PieItem item = makeItem(resid); // use center and sweep to determine layout item.setFixedSlice(center, sweep); mRenderer.addItem(item); mPreferences.add(pref); mPreferenceMap.put(pref, item); int nOfEntries = pref.getEntries().length; Loading @@ -113,6 +116,7 @@ public class PieController { } else { inner = makeItem(pref.getEntries()[i]); } layoutInner(inner, i, nOfEntries); item.addItem(inner); final int index = i; inner.setOnClickListener(new OnClickListener() { Loading @@ -125,6 +129,23 @@ public class PieController { }); } } return item; } public PieItem makeDialItem(ListPreference pref, int iconId, float center, float sweep) { PieItem item = makeItem(iconId); return item; } protected void layoutInner(PieItem item, int ix, int n) { float sweep = (float) (SWEEP * Math.PI);//FLOAT_PI_DIVIDED_BY_TWO / Math.max(n, 5); float start = CENTER + (n - 1) * (sweep / 2f); item.setFixedSlice(start - ix * sweep, sweep); } public void addItem(String prefKey, float center, float sweep) { PieItem item = makeItem(prefKey, center, sweep); mRenderer.addItem(item); } public void setPreferenceGroup(PreferenceGroup group) { Loading src/com/android/camera/PreviewGestures.java +30 −20 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package com.android.camera; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; Loading @@ -44,6 +43,12 @@ public class PreviewGestures private static final int MODE_ZOOM = 2; private static final int MODE_MODULE = 3; private static final int MODE_ALL = 4; private static final int MODE_SWIPE = 5; public static final int DIR_UP = 0; public static final int DIR_DOWN = 1; public static final int DIR_LEFT = 2; public static final int DIR_RIGHT = 3; private CameraActivity mActivity; private SingleTapListener mTapListener; Loading @@ -61,6 +66,7 @@ public class PreviewGestures private boolean mZoomOnly; private int mOrientation; private int[] mLocation; private SwipeListener mSwipeListener; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { Loading @@ -76,8 +82,12 @@ public class PreviewGestures public void onSingleTapUp(View v, int x, int y); } interface SwipeListener { public void onSwipe(int direction); } public PreviewGestures(CameraActivity ctx, SingleTapListener tapListener, ZoomRenderer zoom, PieRenderer pie) { ZoomRenderer zoom, PieRenderer pie, SwipeListener swipe) { mActivity = ctx; mTapListener = tapListener; mPie = pie; Loading @@ -88,6 +98,7 @@ public class PreviewGestures mTapTimeout = ViewConfiguration.getTapTimeout(); mEnabled = true; mLocation = new int[2]; mSwipeListener = swipe; } public void setRenderOverlay(RenderOverlay overlay) { Loading Loading @@ -149,6 +160,11 @@ public class PreviewGestures } } else if (mMode == MODE_NONE) { return false; } else if (mMode == MODE_SWIPE) { if (MotionEvent.ACTION_UP == m.getActionMasked()) { mSwipeListener.onSwipe(getSwipeDirection(m)); } return true; } else if (mMode == MODE_PIE) { if (MotionEvent.ACTION_POINTER_DOWN == m.getActionMasked()) { sendToPie(makeCancelEvent(m)); Loading Loading @@ -215,18 +231,13 @@ public class PreviewGestures || Math.abs(m.getY() - mDown.getY()) > mSlop) { // moved too far and no timeout yet, no focus or pie cancelPie(); if (isSwipe(m, true)) { int dir = getSwipeDirection(m); if (dir == DIR_LEFT) { mMode = MODE_MODULE; return mActivity.superDispatchTouchEvent(m); } else { cancelActivityTouchHandling(m); if (isSwipe(m , false)) { mMode = MODE_NONE; } else if (!mZoomOnly) { mMode = MODE_PIE; openPie(); sendToPie(m); } } } } Loading @@ -246,32 +257,31 @@ public class PreviewGestures } // left tests for finger moving right to left private boolean isSwipe(MotionEvent m, boolean left) { private int getSwipeDirection(MotionEvent m) { float dx = 0; float dy = 0; switch (mOrientation) { case 0: dx = m.getX() - mDown.getX(); dy = Math.abs(m.getY() - mDown.getY()); dy = m.getY() - mDown.getY(); break; case 90: dx = - (m.getY() - mDown.getY()); dy = Math.abs(m.getX() - mDown.getX()); dy = m.getX() - mDown.getX(); break; case 180: dx = -(m.getX() - mDown.getX()); dy = Math.abs(m.getY() - mDown.getY()); dy = m.getY() - mDown.getY(); break; case 270: dx = m.getY() - mDown.getY(); dy = Math.abs(m.getX() - mDown.getX()); dy = m.getX() - mDown.getX(); break; } if (left) { return (dx < 0 && dy / -dx < 0.6f); } else { return (dx > 0 && dy / dx < 0.6f); } if (dx < 0 && (Math.abs(dy) / -dx < 2)) return DIR_LEFT; if (dx > 0 && (Math.abs(dy) / dx < 2)) return DIR_RIGHT; if (dy > 0) return DIR_DOWN; return DIR_UP; } private boolean isInside(MotionEvent evt, View v) { Loading Loading
res/values/dimens.xml +3 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,9 @@ <dimen name="pie_touch_slop">12dp</dimen> <dimen name="pie_touch_offset">40dp</dimen> <dimen name="pie_view_size">48dp</dimen> <dimen name="pie_arc_offset">48dp</dimen> <dimen name="pie_item_radius">206dp</dimen> <dimen name="pie_arc_radius">362dp</dimen> <dimen name="focus_radius_offset">8dp</dimen> <dimen name="focus_inner_offset">24dp</dimen> <dimen name="focus_outer_stroke">3dp</dimen> Loading
src/com/android/camera/PhotoMenu.java +31 −14 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ public class PhotoMenu extends PieController TimerSettingPopup.Listener, ListPrefSettingPopup.Listener { private static String TAG = "CAM_photomenu"; private static float FLOAT_PI_DIVIDED_BY_TWO = (float) Math.PI / 2; private final String mSettingOff; private PhotoUI mUI; Loading @@ -54,13 +53,20 @@ public class PhotoMenu extends PieController super.initialize(group); mPopup = null; mSecondPopup = null; float sweep = FLOAT_PI_DIVIDED_BY_TWO / 2; addItem(CameraSettings.KEY_FLASH_MODE, FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep); addItem(CameraSettings.KEY_EXPOSURE, 3 * FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep); addItem(CameraSettings.KEY_WHITE_BALANCE, 3 * FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep); float sweep = (float) (SWEEP * Math.PI); PieItem item = null; // flash if (group.findPreference(CameraSettings.KEY_FLASH_MODE) != null) { item = makeItem(CameraSettings.KEY_FLASH_MODE, CENTER - sweep, sweep); mRenderer.addItem(item); } // exposure compensation item = makeItem(CameraSettings.KEY_EXPOSURE, CENTER + sweep, sweep); mRenderer.addItem(item); // camera switcher if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) { PieItem item = makeItem(R.drawable.ic_switch_photo_facing_holo_light); item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep); item = makeItem(R.drawable.ic_switch_photo_facing_holo_light); item.setFixedSlice(CENTER - 2 * sweep, sweep); item.setOnClickListener(new OnClickListener() { @Override public void onClick(PieItem item) { Loading @@ -79,10 +85,11 @@ public class PhotoMenu extends PieController }); mRenderer.addItem(item); } // hdr if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) { PieItem hdr = makeItem(R.drawable.ic_hdr); hdr.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO, sweep); hdr.setOnClickListener(new OnClickListener() { item = makeItem(R.drawable.ic_hdr); item.setFixedSlice(CENTER + 2 * sweep, sweep); item.setOnClickListener(new OnClickListener() { @Override public void onClick(PieItem item) { // Find the index of next camera. Loading @@ -96,8 +103,18 @@ public class PhotoMenu extends PieController } } }); mRenderer.addItem(hdr); mRenderer.addItem(item); } // more settings PieItem more = makeItem(R.drawable.ic_settings_holo_light); more.setFixedSlice(CENTER, sweep); mRenderer.addItem(more); // white balance item = makeItem(CameraSettings.KEY_WHITE_BALANCE, CENTER + sweep, sweep); more.addItem(item); // settings popup mOtherKeys = new String[] { CameraSettings.KEY_SCENE_MODE, CameraSettings.KEY_RECORD_LOCATION, Loading @@ -106,8 +123,8 @@ public class PhotoMenu extends PieController CameraSettings.KEY_TIMER, CameraSettings.KEY_TIMER_SOUND_EFFECTS, }; PieItem item = makeItem(R.drawable.ic_settings_holo_light); item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO * 3, sweep); item = makeItem(R.drawable.ic_settings_holo_light); item.setFixedSlice(CENTER, sweep); item.setOnClickListener(new OnClickListener() { @Override public void onClick(PieItem item) { Loading @@ -117,7 +134,7 @@ public class PhotoMenu extends PieController mUI.showPopup(mPopup); } }); mRenderer.addItem(item); more.addItem(item); } @Override Loading
src/com/android/camera/PhotoUI.java +23 −10 Original line number Diff line number Diff line Loading @@ -56,7 +56,8 @@ public class PhotoUI implements PieListener, PreviewGestures.SingleTapListener, FocusUI, LocationManager.Listener, FaceDetectionListener { FaceDetectionListener, PreviewGestures.SwipeListener { private static final String TAG = "CAM_UI"; Loading Loading @@ -175,7 +176,8 @@ public class PhotoUI implements PieListener, } if (mGestures == null) { // this will handle gesture disambiguation and dispatching mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer); mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer, this); } mGestures.clearTouchReceivers(); mGestures.setRenderOverlay(mRenderOverlay); Loading @@ -196,12 +198,7 @@ public class PhotoUI implements PieListener, updateOnScreenIndicators(params, prefs); } public void initializeControlByIntent() { mBlocker = mActivity.findViewById(R.id.blocker); mMenuButton = mActivity.findViewById(R.id.menu); mMenuButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { private void openMenu() { if (mPieRenderer != null) { // If autofocus is not finished, cancel autofocus so that the // subsequent touch can be handled by PreviewGestures Loading @@ -211,6 +208,15 @@ public class PhotoUI implements PieListener, mPieRenderer.showInCenter(); } } public void initializeControlByIntent() { mBlocker = mActivity.findViewById(R.id.blocker); mMenuButton = mActivity.findViewById(R.id.menu); mMenuButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { openMenu(); } }); if (mController.isImageCaptureIntent()) { mActivity.hideSwitcher(); Loading Loading @@ -723,4 +729,11 @@ public class PhotoUI implements PieListener, mFaceView.setFaces(faces); } @Override public void onSwipe(int direction) { if (direction == PreviewGestures.DIR_UP) { openMenu(); } } }
src/com/android/camera/PieController.java +24 −3 Original line number Diff line number Diff line Loading @@ -37,6 +37,10 @@ public class PieController { protected static final int MODE_PHOTO = 0; protected static final int MODE_VIDEO = 1; protected static float CENTER = (float) Math.PI / 2; protected static final float SWEEP = 0.06f; protected CameraActivity mActivity; protected PreferenceGroup mPreferenceGroup; protected OnPreferenceChangedListener mListener; Loading Loading @@ -84,10 +88,10 @@ public class PieController { return new PieItem(drawable, 0); } public void addItem(String prefKey, float center, float sweep) { public PieItem makeItem(String prefKey, float center, float sweep) { final IconListPreference pref = (IconListPreference) mPreferenceGroup.findPreference(prefKey); if (pref == null) return; if (pref == null) return null; int[] iconIds = pref.getLargeIconIds(); int resid = -1; if (!pref.getUseSingleIcon() && iconIds != null) { Loading @@ -101,7 +105,6 @@ public class PieController { PieItem item = makeItem(resid); // use center and sweep to determine layout item.setFixedSlice(center, sweep); mRenderer.addItem(item); mPreferences.add(pref); mPreferenceMap.put(pref, item); int nOfEntries = pref.getEntries().length; Loading @@ -113,6 +116,7 @@ public class PieController { } else { inner = makeItem(pref.getEntries()[i]); } layoutInner(inner, i, nOfEntries); item.addItem(inner); final int index = i; inner.setOnClickListener(new OnClickListener() { Loading @@ -125,6 +129,23 @@ public class PieController { }); } } return item; } public PieItem makeDialItem(ListPreference pref, int iconId, float center, float sweep) { PieItem item = makeItem(iconId); return item; } protected void layoutInner(PieItem item, int ix, int n) { float sweep = (float) (SWEEP * Math.PI);//FLOAT_PI_DIVIDED_BY_TWO / Math.max(n, 5); float start = CENTER + (n - 1) * (sweep / 2f); item.setFixedSlice(start - ix * sweep, sweep); } public void addItem(String prefKey, float center, float sweep) { PieItem item = makeItem(prefKey, center, sweep); mRenderer.addItem(item); } public void setPreferenceGroup(PreferenceGroup group) { Loading
src/com/android/camera/PreviewGestures.java +30 −20 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package com.android.camera; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; Loading @@ -44,6 +43,12 @@ public class PreviewGestures private static final int MODE_ZOOM = 2; private static final int MODE_MODULE = 3; private static final int MODE_ALL = 4; private static final int MODE_SWIPE = 5; public static final int DIR_UP = 0; public static final int DIR_DOWN = 1; public static final int DIR_LEFT = 2; public static final int DIR_RIGHT = 3; private CameraActivity mActivity; private SingleTapListener mTapListener; Loading @@ -61,6 +66,7 @@ public class PreviewGestures private boolean mZoomOnly; private int mOrientation; private int[] mLocation; private SwipeListener mSwipeListener; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { Loading @@ -76,8 +82,12 @@ public class PreviewGestures public void onSingleTapUp(View v, int x, int y); } interface SwipeListener { public void onSwipe(int direction); } public PreviewGestures(CameraActivity ctx, SingleTapListener tapListener, ZoomRenderer zoom, PieRenderer pie) { ZoomRenderer zoom, PieRenderer pie, SwipeListener swipe) { mActivity = ctx; mTapListener = tapListener; mPie = pie; Loading @@ -88,6 +98,7 @@ public class PreviewGestures mTapTimeout = ViewConfiguration.getTapTimeout(); mEnabled = true; mLocation = new int[2]; mSwipeListener = swipe; } public void setRenderOverlay(RenderOverlay overlay) { Loading Loading @@ -149,6 +160,11 @@ public class PreviewGestures } } else if (mMode == MODE_NONE) { return false; } else if (mMode == MODE_SWIPE) { if (MotionEvent.ACTION_UP == m.getActionMasked()) { mSwipeListener.onSwipe(getSwipeDirection(m)); } return true; } else if (mMode == MODE_PIE) { if (MotionEvent.ACTION_POINTER_DOWN == m.getActionMasked()) { sendToPie(makeCancelEvent(m)); Loading Loading @@ -215,18 +231,13 @@ public class PreviewGestures || Math.abs(m.getY() - mDown.getY()) > mSlop) { // moved too far and no timeout yet, no focus or pie cancelPie(); if (isSwipe(m, true)) { int dir = getSwipeDirection(m); if (dir == DIR_LEFT) { mMode = MODE_MODULE; return mActivity.superDispatchTouchEvent(m); } else { cancelActivityTouchHandling(m); if (isSwipe(m , false)) { mMode = MODE_NONE; } else if (!mZoomOnly) { mMode = MODE_PIE; openPie(); sendToPie(m); } } } } Loading @@ -246,32 +257,31 @@ public class PreviewGestures } // left tests for finger moving right to left private boolean isSwipe(MotionEvent m, boolean left) { private int getSwipeDirection(MotionEvent m) { float dx = 0; float dy = 0; switch (mOrientation) { case 0: dx = m.getX() - mDown.getX(); dy = Math.abs(m.getY() - mDown.getY()); dy = m.getY() - mDown.getY(); break; case 90: dx = - (m.getY() - mDown.getY()); dy = Math.abs(m.getX() - mDown.getX()); dy = m.getX() - mDown.getX(); break; case 180: dx = -(m.getX() - mDown.getX()); dy = Math.abs(m.getY() - mDown.getY()); dy = m.getY() - mDown.getY(); break; case 270: dx = m.getY() - mDown.getY(); dy = Math.abs(m.getX() - mDown.getX()); dy = m.getX() - mDown.getX(); break; } if (left) { return (dx < 0 && dy / -dx < 0.6f); } else { return (dx > 0 && dy / dx < 0.6f); } if (dx < 0 && (Math.abs(dy) / -dx < 2)) return DIR_LEFT; if (dx > 0 && (Math.abs(dy) / dx < 2)) return DIR_RIGHT; if (dy > 0) return DIR_DOWN; return DIR_UP; } private boolean isInside(MotionEvent evt, View v) { Loading