2011-09-19 11 views

risposta

4

Si chiama overscroll in Android.
Vedi http://developer.android.com/reference/android/widget/OverScroller.html e (per esempio) http://developer.android.com/reference/android/widget/ListView.html#setOverscrollFooter(android.graphics.drawable.Drawable)

È disponibile solo dal livello API 9 in poi.
Tuttavia, i dispositivi Samsung sembrano sostenere Overscroll nativamente in Android 2.2

+1

Android 2.2 è il livello di API 8 - vuoi dire 2.1? – Izkata

+0

Commento valido: deve avere letto "API livello 9"; Ho modificato di conseguenza –

21

Aggiungi effetto rimbalzo per ScrollView in Android

Fase 1: Creare un nuovo file in BounceScrollView pacchetto com.base.view

public class BounceScrollView extends ScrollView 
{ 
    private static final int MAX_Y_OVERSCROLL_DISTANCE = 200; 

    private Context mContext; 
    private int mMaxYOverscrollDistance; 

    public BounceScrollView(Context context) 
    { 
     super(context); 
     mContext = context; 
     initBounceScrollView(); 
    } 

    public BounceScrollView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     mContext = context; 
     initBounceScrollView(); 
    } 

    public BounceScrollView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
     mContext = context; 
     initBounceScrollView(); 
    } 

    private void initBounceScrollView() 
    { 
     //get the density of the screen and do some maths with it on the max overscroll distance 
     //variable so that you get similar behaviors no matter what the screen size 

     final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); 
      final float density = metrics.density; 

     mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE); 
    } 

    @Override 
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) 
    { 
     //This is where the magic happens, we have replaced the incoming maxOverScrollY with our own custom variable mMaxYOverscrollDistance; 
     return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent); 
    } 

} 

Fase 2: AL layout, cambiare

<ScrollView 
    android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
/> 

a

<com.base.view.BounceScrollView 
    android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
/> 
+1

ciao, grazie per la soluzione, funziona benissimo per me. Si prega di aggiornare il codice, si ha un piccolo errore in: initBounceListView() dovrebbe essere initBounceScrollView();) –

+0

Grazie per la soluzione, funziona perfettamente. – ACengiz

+0

questo è fantastico !!!! grazie! –

4

ho migliorato versione di questa risposta: https://stackoverflow.com/a/13391248/3256989. Quindi la mia versione è (esempio per HorizontalScrollView):

public class HorizontalOverScrollView extends HorizontalScrollView { 
    private static final int WIDTH_DEVIDER_OVERSCROLL_DISTANCE = 3; 

    private TimeInterpolator mInterpolator; 
    private int mMaxOverscrollDistance; 
    private int mAnimTime; 
    private long mStartTime; 

    /** 
    * Instantiates {@link HorizontalOverScrollView} object. 
    */ 
    public HorizontalOverScrollView(final Context context) { 
     super(context); 
     init(); 
    } 

    /** 
    * Instantiates {@link HorizontalOverScrollView} object. 
    */ 
    public HorizontalOverScrollView(final Context context, final AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    /** 
    * Instantiates {@link HorizontalOverScrollView} object. 
    */ 
    public HorizontalOverScrollView(final Context context, final AttributeSet attrs, final int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    private void init() { 
     final int widthPixels = getContext().getResources().getDisplayMetrics().widthPixels; 
     mMaxOverscrollDistance = widthPixels/WIDTH_DEVIDER_OVERSCROLL_DISTANCE; 
     mAnimTime = getContext().getResources().getInteger(android.R.integer.config_mediumAnimTime); 
     mInterpolator = new DecelerateInterpolator(); 
    } 

    @Override 
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { 
     int overScrollDistance = mMaxOverscrollDistance; 
     if (isTouchEvent) { 
      mStartTime = AnimationUtils.currentAnimationTimeMillis(); 
     } else { 
      final long elapsedTime = AnimationUtils.currentAnimationTimeMillis() - mStartTime; 
      float interpolation = mInterpolator.getInterpolation((float) elapsedTime/mAnimTime); 
      interpolation = interpolation > 1 ? 1 : interpolation; 
      overScrollDistance -= overScrollDistance * interpolation; 
      overScrollDistance = overScrollDistance < 0 ? 0 : overScrollDistance; 
     } 

     return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, overScrollDistance, maxOverScrollY, isTouchEvent); 
    } 
} 
0

Basta usare OverScrollDecoratorHelper

ScrollView scrollView = (ScrollView) findViewById(R.id.scroll_view); 
OverScrollDecoratorHelper.setUpOverScroll(scrollView); 

HorizontalScrollView horizontalScrollView = (HorizontalScrollView) findViewById(R.id.horizontal_scroll_view); 
OverScrollDecoratorHelper.setUpOverScroll(horizontalScrollView); 

https://github.com/EverythingMe/overscroll-decor

Problemi correlati