Android编程ViewPager回弹效果实例分析
本文实例讲述了Android编程ViewPager回弹效果。分享给大家供大家参考,具体如下:
其实在我们很多应用中都看到当ViewPager滑到第一页或者最后一页的时候,如果再滑动的时候,就会有一个缓冲的过程,也就是回弹效果。之前在研究回弹效果的时候,也顺便实现了ViewPager的回弹效果,其实也很简单,一下是实现代码,注释比较少:
packagecom.freesonfish.viewpager_2; importandroid.content.Context; importandroid.graphics.Rect; importandroid.support.v4.view.ViewPager; importandroid.util.AttributeSet; importandroid.view.KeyEvent; importandroid.view.MotionEvent; importandroid.view.animation.TranslateAnimation; publicclassMyViewPagerextendsViewPager{ privateRectmRect=newRect();//用来记录初始位置 privateintpagerCount=3; privateintcurrentItem=0; privatebooleanhandleDefault=true; privatefloatpreX=0f; privatestaticfinalfloatRATIO=0.5f;//摩擦系数 privatestaticfinalfloatSCROLL_WIDTH=30f; publicMyViewPager(Contextcontext){ super(context); } publicMyViewPager(Contextcontext,AttributeSetattrs){ super(context,attrs); } //设置总共有多少页,请记得调用它 publicvoidsetpagerCount(intpagerCount){ this.pagerCount=pagerCount; } //这是当前是第几页,请在onPageSelect方法中调用它。 publicvoidsetCurrentIndex(intcurrentItem){ this.currentItem=currentItem; } @Override publicbooleandispatchKeyEvent(KeyEventevent){ returnsuper.dispatchKeyEvent(event); } @Override publicbooleanonInterceptTouchEvent(MotionEventarg0){ if(arg0.getAction()==MotionEvent.ACTION_DOWN){ preX=arg0.getX();//记录起点 } returnsuper.onInterceptTouchEvent(arg0); } @Override publicbooleanonTouchEvent(MotionEventarg0){ switch(arg0.getAction()){ caseMotionEvent.ACTION_UP: onTouchActionUp(); break; caseMotionEvent.ACTION_MOVE: //当时滑到第一项或者是最后一项的时候。 if((currentItem==0||currentItem==pagerCount-1)){ floatnowX=arg0.getX(); floatoffset=nowX-preX; preX=nowX; if(currentItem==0){ if(offset>SCROLL_WIDTH){//手指滑动的距离大于设定值 whetherConditionIsRight(offset); }elseif(!handleDefault){//这种情况是已经出现缓冲区域了,手指慢慢恢复的情况 if(getLeft()+(int)(offset*RATIO)>=mRect.left){ layout(getLeft()+(int)(offset*RATIO),getTop(),getRight()+(int)(offset*RATIO),getBottom()); } } }else{ if(offset<-SCROLL_WIDTH){ whetherConditionIsRight(offset); }elseif(!handleDefault){ if(getRight()+(int)(offset*RATIO)<=mRect.right){ layout(getLeft()+(int)(offset*RATIO),getTop(),getRight()+(int)(offset*RATIO),getBottom()); } } } }else{ handleDefault=true; } if(!handleDefault){ returntrue; } break; default: break; } returnsuper.onTouchEvent(arg0); } privatevoidwhetherConditionIsRight(floatoffset){ if(mRect.isEmpty()){ mRect.set(getLeft(),getTop(),getRight(),getBottom()); } handleDefault=false; layout(getLeft()+(int)(offset*RATIO),getTop(),getRight()+(int)(offset*RATIO),getBottom()); } privatevoidonTouchActionUp(){ if(!mRect.isEmpty()){ recoveryPosition(); } } privatevoidrecoveryPosition(){ TranslateAnimationta=null; ta=newTranslateAnimation(getLeft(),mRect.left,0,0); ta.setDuration(300); startAnimation(ta); layout(mRect.left,mRect.top,mRect.right,mRect.bottom); mRect.setEmpty(); handleDefault=true; } }
看吧,很简单的,如果大家还有什么方法,可以多多交流。
希望本文所述对大家Android程序设计有所帮助。