1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Android自定义控件(三)——有弹性的ListView

Android自定义控件(三)——有弹性的ListView

时间:2019-04-30 17:44:38

相关推荐

Android自定义控件(三)——有弹性的ListView

上一次我们试验了有弹性的ScrollView。详情

这一次,我们来试验有弹性的ScrollView。

国际惯例,效果图:

主要代码:

[java]view plaincopy importandroid.content.Context;importandroid.graphics.Rect;importandroid.util.AttributeSet;importandroid.view.MotionEvent;importandroid.view.animation.Animation;importandroid.view.animation.Animation.AnimationListener;importandroid.view.animation.TranslateAnimation;importandroid.widget.AbsListView;importandroid.widget.ListView;/***ElasticScrollView有弹性的ListView*/publicclassElasticListViewextendsListView{privatefloaty;privateRectnormal=newRect();privatebooleananimationFinish=true;publicElasticListView(Contextcontext){super(context);init();}publicElasticListView(Contextcontext,AttributeSetattrs){super(context,attrs);init();}protectedvoidonScrollChanged(intl,intt,intoldl,intoldt){}booleanoverScrolled=false;privatevoidinit(){setOnScrollListener(newOnScrollListener(){@OverridepublicvoidonScrollStateChanged(AbsListViewview,intscrollState){}@OverridepublicvoidonScroll(AbsListViewview,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount){overScrolled=false;}});}@OverrideprotectedvoidonOverScrolled(intscrollX,intscrollY,booleanclampedX,booleanclampedY){overScrolled=true;}@OverridepublicbooleanonTouchEvent(MotionEventev){commOnTouchEvent(ev);returnsuper.onTouchEvent(ev);}publicvoidcommOnTouchEvent(MotionEventev){if(animationFinish){intaction=ev.getAction();switch(action){caseMotionEvent.ACTION_DOWN:y=ev.getY();break;caseMotionEvent.ACTION_UP:y=0;if(isNeedAnimation()){animation();}break;caseMotionEvent.ACTION_MOVE:finalfloatpreY=y==0?ev.getY():y;floatnowY=ev.getY();intdeltaY=(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;}}}//开启动画移动publicvoidanimation(){//开启移动动画TranslateAnimationta=newTranslateAnimation(0,0,0,normal.top-getTop());ta.setDuration(200);ta.setAnimationListener(newAnimationListener(){@OverridepublicvoidonAnimationStart(Animationanimation){animationFinish=false;}@OverridepublicvoidonAnimationRepeat(Animationanimation){}@OverridepublicvoidonAnimationEnd(Animationanimation){clearAnimation();//设置回到正常的布局位置layout(normal.left,normal.top,normal.right,normal.bottom);normal.setEmpty();animationFinish=true;}});startAnimation(ta);}//是否需要开启动画publicbooleanisNeedAnimation(){return!normal.isEmpty();}//是否需要移动布局publicbooleanisNeedMove(floatdeltaY){if(overScrolled&&getChildCount()>0){if(getLastVisiblePosition()==getCount()-1&&deltaY>0){returntrue;}if(getFirstVisiblePosition()==0&&deltaY<0){returntrue;}}returnfalse;}}

测试代码:

[java]view plaincopy publicclassMainActivityextendsActivity{ElasticListViewlistView;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView=(ElasticListView)findViewById(R.id.listview);String[]listValues=newString[20];for(inti=0;i<listValues.length;i++){listValues[i]="TextView"+i;}listView.setAdapter(newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listValues));}}[html]view plaincopy publicclassMainActivityextendsActivity{ElasticListViewlistView;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView=(ElasticListView)findViewById(R.id.listview);String[]listValues=newString[20];for(inti=0;i<listValues.length;i++){listValues[i]="TextView"+i;}listView.setAdapter(newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listValues));}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。