2011-09-19 15 views

Respuesta

4

Se llama overscroll en Android.
Ver http://developer.android.com/reference/android/widget/OverScroller.html y (por ejemplo) http://developer.android.com/reference/android/widget/ListView.html#setOverscrollFooter(android.graphics.drawable.Drawable)

Es sólo está disponible desde el nivel del API 9 en adelante.
Sin embargo, los dispositivos de Samsung parecen apoyar Permitir desplazamiento de forma nativa en Android 2.2

+1

Android 2.2 es el nivel API 8 - Qué quiere decir 2.1? – Izkata

+0

Comentario válido: debería haber leído "API nivel 9"; He editado en consecuencia –

21

Añadir efecto de rebote a ScrollView en Android

Paso 1: crear un nuevo archivo en BounceScrollView com.base.view paquete

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); 
    } 

} 

Paso 2: En su diseño, por favor cambie

<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

hola, gracias por la solución, funciona muy bien para mí. Actualice su código, tiene un pequeño error en: initBounceListView() debe ser initBounceScrollView();) –

+0

Gracias por la solución, funciona perfecto. – ACengiz

+0

este es genial !!!! ¡gracias! –

4

he mejorado versión de esta respuesta: https://stackoverflow.com/a/13391248/3256989. Así es mi versión (por ejemplo 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

sólo tiene que utilizar 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

Cuestiones relacionadas