2011-09-19 21 views

回答

4

它在Android中被稱爲overscroll。
http://developer.android.com/reference/android/widget/OverScroller.html和 (例如)http://developer.android.com/reference/android/widget/ListView.html#setOverscrollFooter(android.graphics.drawable.Drawable

它只能從API級別9起。
不過,三星的設備似乎要反彈時原生支持Android 2.2的

+1

的Android 2.2是API級別8 - 你的意思是2.1? – Izkata

+0

有效評論:應該閱讀「API級別9」;我已經編輯了相應的 –

21

添加效果反彈中滾動型機器人

步驟1:在包com.base.view創建新文件BounceScrollView

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

} 

第2步:在你的佈局,請改變

<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

嗨,謝謝你的解決方案,對我很好。請更新你的代碼,你有一個小錯誤:initBounceListView()應該是initBounceScrollView();) –

+0

謝謝你的解決方案,它的作品完美。 – ACengiz

+0

這個 是 太棒了! 謝謝! –

4

我提高了這個答案的版本:https://stackoverflow.com/a/13391248/3256989。 所以我的版本(例如對於Horizo​​ntalScrollView):

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

只需使用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