Android默認(rèn)的ListView在滾動到頂端或底端,沒有很好的提示,下面通過源碼來實現(xiàn)彈性效果。
ListView中有一個控制滑動到邊緣的處理方法:
?protected?boolean?overScrollBy(int?deltaX,?int?deltaY, ???????????????????????????????????int?scrollX,?int?scrollY, ???????????????????????????????????int?scrollRangeX,?int?scrollRangeY, ???????????????????????????????????int?maxOverScrollX,?int?maxOverScrollY, ???????????????????????????????????boolean?isTouchEvent)
?
其中參數(shù)maxOverScrollX---Numbers of piexls to overscroll by in either direction along the Y axis.默認(rèn)為0,修改這個數(shù)值就可以實現(xiàn)滑動到頂端的彈性效果。
?
//為滿足多分辨率的需求,通過屏幕的density來計算maxOverScrollY的具體 ????????DisplayMetrics?metrics?=?mContext.getResources().getDisplayMetrics(); ????????float?density?=?metrics.density; ????????mMaxOverDistance?=?(int)?(density?*?mMaxOverDistance);
完整的工程
FlexibleListView.java
package?sunny.example.ahfourflexiblelistviewtest; import?android.annotation.SuppressLint; import?android.content.Context; import?android.util.AttributeSet; import?android.util.DisplayMetrics; import?android.widget.ListView; @SuppressLint("NewApi") public?class?FlexibleListView?extends?ListView?{ ????private?static?int?mMaxOverDistance?=?50;//將滑動距離改為50,默認(rèn)為0,無彈性效果 ????private?Context?mContext; ????public?FlexibleListView(Context?context,?AttributeSet?attrs, ????????????????????????????int?defStyleAttr)?{ ????????super(context,?attrs,?defStyleAttr); ????????this.mContext?=?context; ????????initView(); ????} ????public?FlexibleListView(Context?context,?AttributeSet?attrs)?{ ????????super(context,?attrs); ????????this.mContext?=?context; ????????initView(); ????} ????public?FlexibleListView(Context?context)?{ ????????super(context); ????????this.mContext?=?context; ????????initView(); ????} ????private?void?initView()?{ ???? //為滿足多分辨率的需求,通過屏幕的density來計算maxOverScrollY的具體 ????????DisplayMetrics?metrics?=?mContext.getResources().getDisplayMetrics(); ????????float?density?=?metrics.density; ????????mMaxOverDistance?=?(int)?(density?*?mMaxOverDistance); ????} ????@Override ????protected?boolean?overScrollBy(int?deltaX,?int?deltaY, ???????????????????????????????????int?scrollX,?int?scrollY, ???????????????????????????????????int?scrollRangeX,?int?scrollRangeY, ???????????????????????????????????int?maxOverScrollX,?int?maxOverScrollY, ???????????????????????????????????boolean?isTouchEvent)?{ ????????return?super.overScrollBy(deltaX,?deltaY, ????????????????scrollX,?scrollY, ????????????????scrollRangeX,?scrollRangeY, ????????????????maxOverScrollX,?mMaxOverDistance, ????????????????isTouchEvent); ????} }
?
FlexibleListViewTest.java
?
package?sunny.example.ahfourflexiblelistviewtest; //具有彈性的ListView import?android.app.Activity; import?android.os.Bundle; import?android.widget.ArrayAdapter; public?class?FlexibleListViewTest?extends?Activity?{ ????private?FlexibleListView?mFlexibleListView; ????private?String[]?data?=?new?String[30]; ????@Override ????protected?void?onCreate(Bundle?savedInstanceState)?{ ????????super.onCreate(savedInstanceState); ????????setContentView(R.layout.flexible); ????????for?(int?i?=?0;?i?<?30;?i++)?{ ????????????data[i]?=?""?+?i; ????????} ????????mFlexibleListView?=?(FlexibleListView)?findViewById(R.id.flexible_listview); ????????mFlexibleListView.setAdapter(new?ArrayAdapter(this, ????????????????android.R.layout.simple_list_item_1, ????????????????data)); ????} }
?
flexible.xml