您的位置:首页 > 移动开发 > Android开发

Android弹性滑动

2015-12-18 11:39 525 查看

1、View使用Scroller滑动

/**
*在scroller.startScroll()方法中,会将scrollX和deltaX相加存入mFinalX中
*invalidate()方法会调用draw()方法,draw()会调用computeScroll()方法,而在View
*中computeScroll()方法是空实现,所以要复写该方法,在方法中调用
*scrollTo(scroller.getCurrX(),scroller.getCurrY()),又因为getCurrX()方法返回的是mFinalX
*的值,调用postInvalidate()方法进行第二次重绘实现view的刷新
*/
Scrollerscroller=newScroller(mContext);
privatevoidsmoothScrollTo(intdestX,intdestY){
intscrollX=getScrollX();
intdeltaX=destX-scrollX;
//1000ms内滑向destX,效果就是慢慢滑动
scroller.startScroll(scrollX,0,deltaX,0,1000);
invalidate();
}
@Override
publicvoidcomputeScroll(){
if(scroller.computeScrollOffset()){
scrollTo(scroller.getCurrX(),scroller.getCurrY());
postInvalidate();
}
}

2、使用动画

finalintstartX=0;
finalintdeltaX=100;
finalButtonmButton=newButton(mContext);
ValueAnimatoranimator=ValueAnimator.ofInt(0,1).setDuration(1000);
animator.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){
@Override
publicvoidonAnimationUpdate(ValueAnimatoranimator){
floatfraction=animator.getAnimatedFraction();
mButton.scrollTo(startX+(int)(deltaX*fraction),0);
}
});
animator.start();

3、使用延时加载Handler

privatestaticfinalintMESSAGE_SCROLL_TO=1;
privatestaticfinalintFRAME_COUNT=30;
privatestaticfinalintDELAYED_TIME=33;
privateintmCount=0;
privateButtonmButton;
privateHandlermHandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseMESSAGE_SCROLL_TO:
mCount++;
if(mCount<=FRAME_COUNT){
floatfraction=mCount/(float)FRAME_COUNT;
intscrollX=(int)(fraction*100);
mButton.scrollTo(scrollX,0);
mHandler.sendEmptyMessageDelayed(MESSAGE_SCROLL_TO,DELAYED_TIME);
}
break;
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: