diff options
author | Steve Slaven <bpk@hoopajoo.net> | 2011-01-01 21:14:06 (GMT) |
---|---|---|
committer | Steve Slaven <bpk@hoopajoo.net> | 2011-01-01 21:14:06 (GMT) |
commit | ec8f0e387aa0bee03b47baca8888b4094ee8fa43 (patch) | |
tree | 69d28acdbbcc481a88041fd0ef01157922e042f0 /src/net/hoopajoo/android/SoftKeys/InputSmoother.java | |
parent | 6f84379257c7c95b35427a64c4aa5e09f619fea4 (diff) | |
download | SoftKeys-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
Diffstat (limited to 'src/net/hoopajoo/android/SoftKeys/InputSmoother.java')
-rw-r--r-- | src/net/hoopajoo/android/SoftKeys/InputSmoother.java | 109 |
1 files changed, 109 insertions, 0 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(); + } + + }; + } + + } +} |