Android 实现ViewPager边界回弹效果实例代码
废话不多说了,直接给大家贴代码了,具体代码如下所示:
publicclassBounceBackViewPagerextendsViewPager{
privateintcurrentPosition=0;
privateRectmRect=newRect();//用来记录初始位置
privatebooleanhandleDefault=true;
privatefloatpreX=0f;
privatestaticfinalfloatRATIO=0.5f;//摩擦系数
privatestaticfinalfloatSCROLL_WIDTH=10f;
publicBounceBackViewPager(Contextcontext){
super(context);
}
publicBounceBackViewPager(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
@Override
publicbooleandispatchKeyEvent(KeyEventevent){
returnsuper.dispatchKeyEvent(event);
}
@Override
publicbooleanonInterceptTouchEvent(MotionEventev){
if(ev.getAction()==MotionEvent.ACTION_DOWN){
preX=ev.getX();//记录起点
currentPosition=getCurrentItem();
}
returnsuper.onInterceptTouchEvent(ev);
}
@Override
publicbooleanonTouchEvent(MotionEventev){
switch(ev.getAction()){
caseMotionEvent.ACTION_UP:
onTouchActionUp();
break;
caseMotionEvent.ACTION_MOVE:
if(getAdapter().getCount()==1){
floatnowX=ev.getX();
floatoffset=nowX-preX;
preX=nowX;
if(offset>SCROLL_WIDTH){//手指滑动的距离大于设定值
whetherConditionIsRight(offset);
}elseif(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());
}
}
}elseif((currentPosition==0||currentPosition==getAdapter().getCount()-1)){
floatnowX=ev.getX();
floatoffset=nowX-preX;
preX=nowX;
if(currentPosition==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(ev);
}
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=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实现ViewPager边界回弹效果实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!