diff options
Diffstat (limited to 'src/net/hoopajoo')
-rw-r--r-- | src/net/hoopajoo/android/SoftKeys/InputSmoother.java | 109 | ||||
-rw-r--r-- | src/net/hoopajoo/android/SoftKeys/SoftKeysService.java | 11 |
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(); } |