2011-09-19 28 views

Trả lời

4

Nó được gọi là ghi đè trong Android.
Xem http://developer.android.com/reference/android/widget/OverScroller.html và (ví dụ) http://developer.android.com/reference/android/widget/ListView.html#setOverscrollFooter(android.graphics.drawable.Drawable)

Đó là chỉ có sẵn từ cấp API 9 trở đi.
Tuy nhiên, các thiết bị Samsung dường như để hỗ trợ thanh cuộn tự nhiên trong Android 2.2

+1

Android 2.2 là API mức 8 - Ý anh là 2.1? – Izkata

+0

Nhận xét hợp lệ: phải đọc "API cấp 9"; Tôi đã chỉnh sửa cho phù hợp –

21

Thêm hiệu ứng nảy để scrollview trong android

Bước 1: Tạo BounceScrollView file mới trong gói 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); 
    } 

} 

Bước 2: Tại bố trí của bạn, hãy thay đổi

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

để

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

hi, cảm ơn vì giải pháp, công trình tuyệt vời cho tôi. Xin vui lòng cập nhật mã của bạn, u có một chút sai lầm trong: initBounceListView() nên được initBounceScrollView();) –

+0

Cảm ơn bạn đã giải pháp, nó hoạt động hoàn hảo. – ACengiz

+0

này là tuyệt vời !!!! cảm ơn bạn! –

4

tôi đã được cải thiện phiên bản của câu trả lời này: https://stackoverflow.com/a/13391248/3256989. Vì vậy, phiên bản của tôi là (ví dụ cho 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

Chỉ cần sử dụng 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

Các vấn đề liên quan