生活随笔
收集整理的這篇文章主要介紹了
Android自定义控件(三)——有弹性的ListView
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一次我們試驗了有彈性的ScrollView。詳情
這一次,我們來試驗有彈性的ScrollView。
國際慣例,效果圖:
?
主要代碼:
?
[java]?view plaincopy
import?android.content.Context;??import?android.graphics.Rect;??import?android.util.AttributeSet;??import?android.view.MotionEvent;??import?android.view.animation.Animation;??import?android.view.animation.Animation.AnimationListener;??import?android.view.animation.TranslateAnimation;??import?android.widget.AbsListView;??import?android.widget.ListView;????public?class?ElasticListView?extends?ListView?{??????private?float?y;??????private?Rect?normal?=?new?Rect();??????private?boolean?animationFinish?=?true;????????public?ElasticListView(Context?context)?{??????????super(context);??????????init();??????}????????public?ElasticListView(Context?context,?AttributeSet?attrs)?{??????????super(context,?attrs);??????????init();??????}????????protected?void?onScrollChanged(int?l,?int?t,?int?oldl,?int?oldt)?{????????}????????boolean?overScrolled?=?false;??????private?void?init()?{??????????setOnScrollListener(new?OnScrollListener()?{??????????????@Override??????????????public?void?onScrollStateChanged(AbsListView?view,?int?scrollState)?{??????????????}????????????????@Override??????????????public?void?onScroll(AbsListView?view,?int?firstVisibleItem,?int?visibleItemCount,?int?totalItemCount)?{??????????????????overScrolled?=?false;??????????????}??????????});??????}????????????@Override??????protected?void?onOverScrolled(int?scrollX,?int?scrollY,?boolean?clampedX,?boolean?clampedY)?{??????????overScrolled?=?true;??????}????????@Override??????public?boolean?onTouchEvent(MotionEvent?ev)?{??????????commOnTouchEvent(ev);??????????return?super.onTouchEvent(ev);??????}????????public?void?commOnTouchEvent(MotionEvent?ev)?{??????????if?(animationFinish)?{??????????????int?action?=?ev.getAction();??????????????switch?(action)?{??????????????case?MotionEvent.ACTION_DOWN:??????????????????y?=?ev.getY();??????????????????break;??????????????case?MotionEvent.ACTION_UP:??????????????????y?=?0;??????????????????if?(isNeedAnimation())?{??????????????????????animation();??????????????????}??????????????????break;??????????????case?MotionEvent.ACTION_MOVE:??????????????????final?float?preY?=?y?==?0???ev.getY()?:?y;??????????????????float?nowY?=?ev.getY();??????????????????int?deltaY?=?(int)?(preY?-?nowY);????????????????????y?=?nowY;??????????????????????????????????if?(isNeedMove(deltaY))?{??????????????????????if?(normal.isEmpty())?{??????????????????????????????????????????????????normal.set(getLeft(),?getTop(),?getRight(),?getBottom());??????????????????????}??????????????????????????????????????????layout(getLeft(),?getTop()?-?deltaY?/?2,?getRight(),?getBottom()?-?deltaY?/?2);??????????????????}??????????????????break;??????????????default:??????????????????break;??????????????}??????????}??????}????????????public?void?animation()?{??????????????????TranslateAnimation?ta?=?new?TranslateAnimation(0,?0,?0,?normal.top?-?getTop());??????????ta.setDuration(200);??????????ta.setAnimationListener(new?AnimationListener()?{??????????????@Override??????????????public?void?onAnimationStart(Animation?animation)?{??????????????????animationFinish?=?false;????????????????}????????????????@Override??????????????public?void?onAnimationRepeat(Animation?animation)?{????????????????}????????????????@Override??????????????public?void?onAnimationEnd(Animation?animation)?{??????????????????clearAnimation();??????????????????????????????????layout(normal.left,?normal.top,?normal.right,?normal.bottom);??????????????????normal.setEmpty();??????????????????animationFinish?=?true;??????????????}??????????});??????????startAnimation(ta);??????}????????????public?boolean?isNeedAnimation()?{??????????return?!normal.isEmpty();??????}????????????public?boolean?isNeedMove(float?deltaY)?{??????????if?(overScrolled?&&?getChildCount()?>?0)?{??????????????if?(getLastVisiblePosition()?==?getCount()?-?1?&&?deltaY?>?0)?{??????????????????return?true;??????????????}??????????????if?(getFirstVisiblePosition()?==?0?&&?deltaY?<?0)?{??????????????????return?true;??????????????}??????????}??????????return?false;??????}??}??
測試代碼:
?
?
[java]?view plaincopy
public?class?MainActivity?extends?Activity?{??????ElasticListView?listView;??????@Override??????protected?void?onCreate(Bundle?savedInstanceState)?{??????????super.onCreate(savedInstanceState);??????????setContentView(R.layout.activity_main);????????????????????listView?=?(ElasticListView)?findViewById(R.id.listview);????????????????????String[]?listValues?=?new?String[20];??????????for?(int?i=0;i<listValues.length;i++)?{??????????????listValues[i]?=?"TextView"?+?i;??????????}??????????listView.setAdapter(new?ArrayAdapter<String>(this,?android.R.layout.simple_list_item_1,?listValues));??????}??}?? ?
[html]?view plaincopy
public?class?MainActivity?extends?Activity?{??????ElasticListView?listView;??????@Override??????protected?void?onCreate(Bundle?savedInstanceState)?{??????????super.onCreate(savedInstanceState);??????????setContentView(R.layout.activity_main);????????????????????listView?=?(ElasticListView)?findViewById(R.id.listview);????????????????????String[]?listValues?=?new?String[20];??????????for?(int?i=0;i<listValues.length;i++)?{??????????????listValues[i]?=?"TextView"?+?i;??????????}??????????listView.setAdapter(new?ArrayAdapter<String>(this,?android.R.layout.simple_list_item_1,?listValues));??????}??}?
總結
以上是生活随笔為你收集整理的Android自定义控件(三)——有弹性的ListView的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。