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程序设计有所帮助。