Android自定义View弹性滑动Scroller详解
本文实例为大家分享了Android弹性滑动类Scroller的具体代码,供大家参考,具体内容如下
Scroller是什么
Scroller就是一个滑动帮助类。它并不可以使View真正的滑动,而是配合scrollTo/ScrollBy让view产生缓慢的滑动,产生动画的效果,其实和属性动画是同一个原理。在我看来,Scroller跟属性动画的平移的效果是一样的。
如何使用
//①实例一个Scroller,它有三个构造方法如下 //publicScroller(Contextcontext) //publicScroller(Contextcontext,Interpolatorinterpolator)//传入一个时间插值器 //publicScroller(Contextcontext,Interpolatorinterpolator,booleanflywheel) ScrollermScroller=newScroller(context); //②使用Scroller //startScroll()传入一些参数:开始位置,结束位置,开始时间滑动到结束位置的完成时间。 mScrooler.startScroll(intstartX,intstartY,intendx,intendY,intduration); invalidate();//在ViewGroup中,invalidate()方法会导致computeScroll()方法的执行 //③在computeScroll()的方法中判断:mScroller是否结束,如果没有结束就调用scrollTo()让view处于正确的位置 @Override publicvoidcomputeScroll(){ //computeScrollOffset()判断是否还在滚动,如果还在滚动,会获取到某一时刻view应该所在的位置,刷新Scroller中mCurrX,mCurrY的值,并且returntrue; if(mScroller.computeScrollOffset()){ scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); //更新界面 postInvalidate(); } super.computeScroll(); }
使用示例:
packagecom.liujian.chart; /** *Scroller练习,一个简单的ViewPager *@author:liujian *@since:2017/12/17 */ publicclassScrollLayoutextendsViewGroup{ privateScrollermScroller; //当前设备滑动的最小距离 privateintmTouchSlop; privateintleftBorder;//布局内容的左边界 privateintrightBorder;//布局内容的右边界 privatefloatmRawXDown; privatefloatmRawXMove; privatefloatmRawXLastMove; publicScrollLayout(Contextcontext){ super(context); initView(context); } publicScrollLayout(Contextcontext,@NullableAttributeSetattrs){ super(context,attrs); initView(context); } publicScrollLayout(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); initView(context); } privatevoidinitView(Contextcontext){ mTouchSlop=ViewConfiguration.get(getContext()).getScaledTouchSlop(); mScroller=newScroller(getContext()); } @Override protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){ super.onMeasure(widthMeasureSpec,heightMeasureSpec); //为ScrollLayout中的某一个子View给出一个建议的测量大小和测量模式 measureChildren(widthMeasureSpec,heightMeasureSpec); } @Override protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){ intchildCount=getChildCount(); for(inti=0;imTouchSlop){ returntrue; } break; caseMotionEvent.ACTION_UP: break; } returnsuper.onInterceptTouchEvent(ev); } @SuppressLint("ClickableViewAccessibility") @Override publicbooleanonTouchEvent(MotionEventevent){ switch(event.getAction()){ caseMotionEvent.ACTION_MOVE: mRawXMove=event.getRawX(); intdistanceX=(int)(mRawXLastMove-mRawXMove); //对边界异常情况的处理 if(getScrollX()+distanceX rightBorder){ scrollBy(rightBorder-getWidth(),0); } scrollBy(distanceX,0); mRawXLastMove=mRawXMove; break; caseMotionEvent.ACTION_UP: //当前所在的page页面 inttargetIndex=(getScrollX()+getWidth()/2)/getWidth(); intdx=targetIndex*getWidth()-getScrollX(); Log.i("TAG","dx:"+dx); Log.i("TAG","getScrollX:"+getScrollX()); Log.i("TAG","getWidth:"+getWidth()); //第二步,调用startScroll()方法来初始化滚动数据并刷新界面 mScroller.startScroll(getScrollX(),0,dx,0); invalidate(); break; } returnsuper.onTouchEvent(event); } @Override publicvoidcomputeScroll(){ if(mScroller.computeScrollOffset()){ scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); invalidate(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。