diff --git a/.gitignore b/.gitignore index 3ce23fa..4ac6b31 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,13 @@ horizontallistview/bin horizontallistview/gen sample/bin sample/gen -library/pom.xml \ No newline at end of file +library/pom.xml + +# Files to be ignored +*~ +android-support-v4.jar +R.java +project.properties +lint.xml +.DS_STORE +.factorypath \ No newline at end of file diff --git a/library/src/main/.classpath b/library/src/main/.classpath new file mode 100644 index 0000000..9055b18 --- /dev/null +++ b/library/src/main/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/library/src/main/.project b/library/src/main/.project new file mode 100644 index 0000000..4082740 --- /dev/null +++ b/library/src/main/.project @@ -0,0 +1,33 @@ + + + main + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/library/src/main/.settings/org.eclipse.jdt.core.prefs b/library/src/main/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..b080d2d --- /dev/null +++ b/library/src/main/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index 26fab17..6a96f1a 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -1,5 +1,10 @@ - + - + - + + + \ No newline at end of file diff --git a/library/src/main/java/it/sephiroth/android/library/widget/AbsHListView.java b/library/src/main/java/it/sephiroth/android/library/widget/AbsHListView.java index c47f4f3..c4db898 100644 --- a/library/src/main/java/it/sephiroth/android/library/widget/AbsHListView.java +++ b/library/src/main/java/it/sephiroth/android/library/widget/AbsHListView.java @@ -1,5 +1,14 @@ package it.sephiroth.android.library.widget; +import it.sephiroth.android.library.R; +import it.sephiroth.android.library.util.ViewHelperFactory; +import it.sephiroth.android.library.util.ViewHelperFactory.ViewHelper; +import it.sephiroth.android.library.util.v11.MultiChoiceModeListener; +import it.sephiroth.android.library.util.v11.MultiChoiceModeWrapper; + +import java.util.ArrayList; +import java.util.List; + import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.Context; @@ -46,20 +55,12 @@ import android.widget.ListAdapter; import android.widget.ListView; -import java.util.ArrayList; -import java.util.List; - -import it.sephiroth.android.library.R; -import it.sephiroth.android.library.util.ViewHelperFactory; -import it.sephiroth.android.library.util.ViewHelperFactory.ViewHelper; -import it.sephiroth.android.library.util.v11.MultiChoiceModeListener; -import it.sephiroth.android.library.util.v11.MultiChoiceModeWrapper; - @TargetApi(Build.VERSION_CODES.HONEYCOMB) public abstract class AbsHListView extends AdapterView implements ViewTreeObserver.OnGlobalLayoutListener, ViewTreeObserver.OnTouchModeChangeListener { private static final String TAG = "AbsListView"; + public static int CHILD_WIDTH; /** * Disables the transcript mode. @@ -3664,7 +3665,7 @@ void reportScrollStateChange( int newState ) { } } } - + /** * Responsible for fling behavior. Use {@link #start(int)} to initiate a fling. Each frame of the fling is handled in * {@link #run()}. A FlingRunnable will keep re-posting itself until the fling is done. @@ -3717,12 +3718,31 @@ void start( int initialVelocity ) { int initialX = initialVelocity < 0 ? Integer.MAX_VALUE : 0; mLastFlingX = initialX; mScroller.setInterpolator( null ); - mScroller.fling( initialX, 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE ); + + mScroller.fling( initialX, 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE,getScrollX() ); mTouchMode = TOUCH_MODE_FLING; - mViewHelper.postOnAnimation( this ); + mViewHelper.postOnAnimation(this); + } + + int getScrollX() { + View firstChild = getChildAt(0); + int scrollX = 0; + if (getFirstVisiblePosition() == 0) { + scrollX = (-firstChild.getLeft()); + CHILD_WIDTH = (int) (firstChild.getMeasuredWidth() - (32 * getResources() + .getDisplayMetrics().density)); + } else if (getFirstVisiblePosition() > 0) { + scrollX = (int) (-firstChild.getLeft() + + (firstChild.getMeasuredWidth() + (32 * getResources() + .getDisplayMetrics().density)) + (getFirstVisiblePosition() - 1) + * (firstChild.getMeasuredWidth())); + + CHILD_WIDTH = firstChild.getMeasuredWidth(); + } + return scrollX; } - void startSpringback() { + void startSpringback() { if ( mScroller.springBack( getScrollX(), 0, 0, 0, 0, 0 ) ) { mTouchMode = TOUCH_MODE_OVERFLING; invalidate(); @@ -3735,7 +3755,7 @@ void startSpringback() { void startOverfling( int initialVelocity ) { mScroller.setInterpolator( null ); - mScroller.fling( getScrollX(), 0, initialVelocity, 0, Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 0, getWidth(), 0 ); + mScroller.fling( getScrollX(), 0, initialVelocity, 0, Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 0, getWidth(), 0,getScrollX() ); mTouchMode = TOUCH_MODE_OVERFLING; invalidate(); mViewHelper.postOnAnimation( this ); diff --git a/library/src/main/java/it/sephiroth/android/library/widget/OverScroller.java b/library/src/main/java/it/sephiroth/android/library/widget/OverScroller.java index e664c99..a5f15cc 100644 --- a/library/src/main/java/it/sephiroth/android/library/widget/OverScroller.java +++ b/library/src/main/java/it/sephiroth/android/library/widget/OverScroller.java @@ -424,8 +424,8 @@ public boolean springBack(int startX, int startY, int minX, int maxX, int minY, } public void fling(int startX, int startY, int velocityX, int velocityY, - int minX, int maxX, int minY, int maxY) { - fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, 0, 0); + int minX, int maxX, int minY, int maxY,int scrollX) { + fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, 0, 0,scrollX); } /** @@ -456,7 +456,7 @@ public void fling(int startX, int startY, int velocityX, int velocityY, * direction will be possible. */ public void fling(int startX, int startY, int velocityX, int velocityY, - int minX, int maxX, int minY, int maxY, int overX, int overY) { + int minX, int maxX, int minY, int maxY, int overX, int overY,int scrollX) { // Continue a scroll or fling in progress if (mFlywheel && !isFinished()) { float oldVelocityX = mScrollerX.mCurrVelocity; @@ -469,8 +469,8 @@ public void fling(int startX, int startY, int velocityX, int velocityY, } mMode = FLING_MODE; - mScrollerX.fling(startX, velocityX, minX, maxX, overX); - mScrollerY.fling(startY, velocityY, minY, maxY, overY); + mScrollerX.fling(startX, velocityX, minX, maxX, overX,scrollX); + mScrollerY.fling(startY, velocityY, minY, maxY, overY,scrollX); } /** @@ -768,7 +768,7 @@ private void startSpringback(int start, int end, int velocity) { mDuration = (int) (1000.0 * Math.sqrt(-2.0 * delta / mDeceleration)); } - void fling(int start, int velocity, int min, int max, int over) { + void fling(int start, int velocity, int min, int max, int over,int scrollX) { mOver = over; mFinished = false; mCurrVelocity = mVelocity = velocity; @@ -789,9 +789,21 @@ void fling(int start, int velocity, int min, int max, int over) { totalDistance = getSplineFlingDistance(velocity); } - mSplineDistance = (int) (totalDistance * Math.signum(velocity)); - mFinal = start + mSplineDistance; + mSplineDistance = (int) (totalDistance * 1.5 * Math + .signum(velocity)); + int totalDistanceToScroll = mSplineDistance + scrollX; + int initPosition = scrollX / AbsHListView.CHILD_WIDTH; + int position = totalDistanceToScroll / AbsHListView.CHILD_WIDTH; + if (position == initPosition) { + mDuration = mSplineDuration = mSplineDuration + 100; + if (mSplineDistance > 0) + position = position + 1; + + } + mSplineDistance = position * AbsHListView.CHILD_WIDTH - scrollX; + mFinal = start + mSplineDistance; + // Clamp to a valid final position if (mFinal < min) { adjustDuration(mStart, mFinal, min); @@ -855,7 +867,7 @@ private void startAfterEdge(int start, int min, int max, int velocity) { } else { final double totalDistance = getSplineFlingDistance(velocity); if (totalDistance > Math.abs(overDistance)) { - fling(start, velocity, positive ? min : start, positive ? start : max, mOver); + fling(start, velocity, positive ? min : start, positive ? start : max, mOver,0); } else { startSpringback(start, edge, velocity); } diff --git a/library/src/main/project.properties b/library/src/main/project.properties new file mode 100644 index 0000000..91d2b02 --- /dev/null +++ b/library/src/main/project.properties @@ -0,0 +1,15 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-19 +android.library=true