2011-09-19 9 views

Odpowiedz

4

To się nazywa przeszukiwanie w systemie Android.
Zobacz http://developer.android.com/reference/android/widget/OverScroller.html i (na przykład) http://developer.android.com/reference/android/widget/ListView.html#setOverscrollFooter(android.graphics.drawable.Drawable)

Jest ona dostępna tylko z poziomu API 9 kolejnych.
Jednakże urządzenia Samsung wydaje się dalekie przewinięcie obsługują natywnie w systemie Android 2.2

+1

Android 2.2 jest poziom API 8 - nie oznacza to 2.1? – Izkata

+0

Ważna uwaga: powinna być przeczytana "Poziom API 9"; Odpowiednio edytowałem –

21

dodać efekt bounce do Scrollview w android

Krok 1: Tworzenie nowego pliku BounceScrollView w opakowaniu 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); 
    } 

} 

Krok 2: W układzie należy zmienić

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

do

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

Cześć, dzięki za rozwiązanie, działa doskonale dla mnie. Proszę zaktualizować swój kod, masz mały błąd: initBounceListView() powinien być initBounceScrollView();) –

+0

Dziękuję za rozwiązanie, działa idealnie. – ACengiz

+0

ten jest super !!!! dziękuję! –

4

mam ulepszoną wersję tej odpowiedzi: https://stackoverflow.com/a/13391248/3256989. Więc moja wersja jest (przykład dla 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

Wystarczy użyć 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

Powiązane problemy