具有彈性效果的ListView如何實(shí)現(xiàn)
Android默認(rèn)的ListView在滾動(dòng)到頂端或底端,沒(méi)有很好的提示,下面通過(guò)源碼來(lái)實(shí)現(xiàn)彈性效果。
ListView中有一個(gè)控制滑動(dòng)到邊緣的處理方法:
?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,修改這個(gè)數(shù)值就可以實(shí)現(xiàn)滑動(dòng)到頂端的彈性效果。
?
//為滿(mǎn)足多分辨率的需求,通過(guò)屏幕的density來(lái)計(jì)算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;//將滑動(dòng)距離改為50,默認(rèn)為0,無(wú)彈性效果
????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()?{
???? //為滿(mǎn)足多分辨率的需求,通過(guò)屏幕的density來(lái)計(jì)算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





