diff options
author | Chris Wren <cwren@android.com> | 2013-03-27 17:13:14 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-03-27 17:13:14 -0700 |
commit | e7deeafcf07a822169f2daa3dbd2e4b650ffa584 (patch) | |
tree | 0fae6f820301238666eae763d9d0c69fad3e46b1 /src/com/android/dreams/phototable/DragGestureDetector.java | |
parent | cca14e1a8cdf90e7a849e92c28b1d7ee6f427b07 (diff) | |
parent | 829f039523e3750f982bd1490e08a86b8eabc182 (diff) | |
download | android_packages_screensavers_PhotoTable-e7deeafcf07a822169f2daa3dbd2e4b650ffa584.tar.gz android_packages_screensavers_PhotoTable-e7deeafcf07a822169f2daa3dbd2e4b650ffa584.tar.bz2 android_packages_screensavers_PhotoTable-e7deeafcf07a822169f2daa3dbd2e4b650ffa584.zip |
am 829f0395: am 1dc94b55: add two-finger move gesture.
* commit '829f039523e3750f982bd1490e08a86b8eabc182':
add two-finger move gesture.
Diffstat (limited to 'src/com/android/dreams/phototable/DragGestureDetector.java')
-rw-r--r-- | src/com/android/dreams/phototable/DragGestureDetector.java | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/com/android/dreams/phototable/DragGestureDetector.java b/src/com/android/dreams/phototable/DragGestureDetector.java new file mode 100644 index 0000000..739163d --- /dev/null +++ b/src/com/android/dreams/phototable/DragGestureDetector.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.dreams.phototable; + +import android.content.Context; +import android.content.res.Resources; +import android.util.Log; +import android.view.MotionEvent; + +/** + * Detect and dispatch edge events. + */ +public class DragGestureDetector { + private static final String TAG = "DragGestureDetector"; + + private final PhotoTable mTable; + private final float mTouchGain; + + private int mPointer; + private float[] mLast; + private float[] mCurrent; + private boolean mDrag; + + public DragGestureDetector(Context context, PhotoTable table) { + Resources res = context.getResources(); + mTouchGain = res.getInteger(R.integer.generalized_touch_gain) / 1000000f; + mTable = table; + mLast = new float[2]; + mCurrent = new float[2]; + } + + private void computeAveragePosition(MotionEvent event, float[] position) { + computeAveragePosition(event, position, -1); + } + + private void computeAveragePosition(MotionEvent event, float[] position, int ignore) { + final int pointerCount = event.getPointerCount(); + position[0] = 0f; + position[1] = 0f; + float count = 0f; + for (int p = 0; p < pointerCount; p++) { + if (p != ignore) { + position[0] += event.getX(p); + position[1] += event.getY(p); + count += 1f; + } + } + position[0] /= count; + position[1] /= count; + } + + public boolean onTouchEvent(MotionEvent event) { + int index = event.getActionIndex(); + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + mPointer = event.getPointerId(index); + computeAveragePosition(event, mLast); + mDrag = false; + break; + + case MotionEvent.ACTION_POINTER_DOWN: + mDrag = mTable.hasFocus(); + computeAveragePosition(event, mLast); + break; + + case MotionEvent.ACTION_POINTER_UP: + computeAveragePosition(event, mLast, index); + break; + + case MotionEvent.ACTION_MOVE: + computeAveragePosition(event, mCurrent); + if (mDrag) { + move(event, false); + } + break; + + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + if (mDrag) { + move(event, true); + } + mDrag = false; + break; + } + + if (mDrag) { + mTable.refreshFocus(); + } + + return mDrag; + } + + private void move(MotionEvent event, boolean drop) { + mTable.move(mTable.getFocused(), + mTouchGain * (mCurrent[0] - mLast[0]), + mTouchGain * (mCurrent[1] - mLast[1]), + drop); + mLast[0] = mCurrent[0]; + mLast[1] = mCurrent[1]; + } +} + |