summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Slaven <bpk@hoopajoo.net>2011-01-01 21:14:06 (GMT)
committerSteve Slaven <bpk@hoopajoo.net>2011-01-01 21:14:06 (GMT)
commitec8f0e387aa0bee03b47baca8888b4094ee8fa43 (patch)
tree69d28acdbbcc481a88041fd0ef01157922e042f0
parent6f84379257c7c95b35427a64c4aa5e09f619fea4 (diff)
downloadSoftKeys-ec8f0e387aa0bee03b47baca8888b4094ee8fa43.zip
SoftKeys-ec8f0e387aa0bee03b47baca8888b4094ee8fa43.tar.gz
SoftKeys-ec8f0e387aa0bee03b47baca8888b4094ee8fa43.tar.bz2
Adding smoother class to try and stop the drag jitter, currently it does
not smoothing but should allow swapping out smoothing ideas pretty easy
-rw-r--r--src/net/hoopajoo/android/SoftKeys/InputSmoother.java109
-rw-r--r--src/net/hoopajoo/android/SoftKeys/SoftKeysService.java11
2 files changed, 118 insertions, 2 deletions
diff --git a/src/net/hoopajoo/android/SoftKeys/InputSmoother.java b/src/net/hoopajoo/android/SoftKeys/InputSmoother.java
new file mode 100644
index 0000000..812c3b4
--- /dev/null
+++ b/src/net/hoopajoo/android/SoftKeys/InputSmoother.java
@@ -0,0 +1,109 @@
+/*
+ *
+ * Copyright (c) 2010 Steve Slaven
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+*/
+package net.hoopajoo.android.SoftKeys;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+// keeps a list of points to drop outliers that make your drag jitter
+public class InputSmoother {
+ private List<PointCheck> mPoints = new ArrayList<PointCheck>();
+ private int mHistLength;
+ private PointCheck mCurrent;
+
+ InputSmoother( int histLength ) {
+ mHistLength = histLength;
+ }
+
+ public void addPoint( int x, int y ) {
+ PointCheck p = new PointCheck();
+ p.x = x;
+ p.y = y;
+ mPoints.add( p );
+
+ // if points too big pop out the last
+ if( mPoints.size() > mHistLength ) {
+ mPoints.remove( 0 );
+ }
+ }
+
+ public void updateOutliers() {
+ // flag the outliers
+ for( PointCheck p : mPoints ) {
+ p.outlier = false;
+ }
+
+ // set current as the last non-outlier
+ mCurrent = null;
+ for( PointCheck p : new ListReverser<PointCheck>( mPoints ) ) {
+ if( mCurrent != null ) {
+ if( p.outlier == false ) {
+ mCurrent = p;
+ }
+ }
+ }
+
+ // if still null just give it the last one even though it's an outlier
+ if( mCurrent == null ) {
+ mCurrent = mPoints.get( mPoints.size() - 1 );
+ }
+ }
+
+ public int[] getCurrent() {
+ int[] ret = new int[ 2 ];
+ ret[ 0 ] = mCurrent.x;
+ ret[ 1 ] = mCurrent.y;
+ return( ret );
+ }
+
+ private class PointCheck {
+ public int x;
+ public int y;
+ public boolean outlier;
+ }
+
+ class ListReverser<T> implements Iterable<T> {
+ private ListIterator<T> listIterator;
+
+ public ListReverser(List<T> wrappedList) {
+ this.listIterator = wrappedList.listIterator(wrappedList.size());
+ }
+
+ public Iterator<T> iterator() {
+ return new Iterator<T>() {
+
+ public boolean hasNext() {
+ return listIterator.hasPrevious();
+ }
+
+ public T next() {
+ return listIterator.previous();
+ }
+
+ public void remove() {
+ listIterator.remove();
+ }
+
+ };
+ }
+
+ }
+}
diff --git a/src/net/hoopajoo/android/SoftKeys/SoftKeysService.java b/src/net/hoopajoo/android/SoftKeys/SoftKeysService.java
index faa2a14..d5e15d7 100644
--- a/src/net/hoopajoo/android/SoftKeys/SoftKeysService.java
+++ b/src/net/hoopajoo/android/SoftKeys/SoftKeysService.java
@@ -44,6 +44,7 @@ import android.widget.ImageButton;
import android.widget.LinearLayout;
public class SoftKeysService extends Service {
+ private InputSmoother i;
private View mView;
private View mBumpView;
private boolean auto_hide;
@@ -169,8 +170,11 @@ public class SoftKeysService extends Service {
mDraggingView = true;
mDidDrag = true;
- int currX = (int)me.getRawX();
- int currY = (int)me.getRawY();
+ i.addPoint( (int)me.getRawX(), (int)me.getRawY() );
+ i.updateOutliers();
+ int[] pts = i.getCurrent();
+ int currX = pts[ 0 ];
+ int currY = pts[ 1 ];
// make our deltas work relative to movement, y
int dx = currX - mDraggingOrigX;
@@ -215,6 +219,7 @@ public class SoftKeysService extends Service {
WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
wm.updateViewLayout( root, l );
+
return( true );
}
}
@@ -300,6 +305,8 @@ public class SoftKeysService extends Service {
wm.addView( mBumpView, makeOverlayParams() );
wm.addView( mView, makeOverlayParams() );
+ i = new InputSmoother( 5 );
+
initOrientation();
}