本文实例为大家分享了Android弹性滑动类照片卷轴的具体代码,供大家参考,具体内容如下
<强>照片卷轴是什么
强>
照片卷轴就是一个滑动帮助类。它并不可以使视图真正的滑动,而是配合scrollTo/ScrollBy让视图产生缓慢的滑动,产生动画的效果,其实和属性动画是同一个原理。在我看来,照片卷轴跟属性动画的平移的效果是一样的。
<>强如何使用
强>
//①实例一个照片卷轴,它有三个构造方法如下//公共照片卷轴(上下文语境)//公共照片卷轴(上下文背景下,插入器插入器)//传入一个时间插值器//公共照片卷轴(上下文背景下,插入器插入器,布尔飞轮) 照片卷轴mScroller=new照片卷轴(上下文);//②使用照片卷轴//startScroll()传入一些参数:开始位置,结束位置,开始时间滑动到结束位置的完成时间。 mScrooler。startScroll (int, int startY int startX endx,恩迪int, int持续时间); 无效();//在ViewGroup中,无效()方法会导致computeScroll()方法的执行//③在computeScroll()的方法中判断:mScroller是否结束,如果没有结束就调用scrollTo()让视图处于正确的位置 @Override 公共空间computeScroll () {//computeScrollOffset()判断是否还在滚动,如果还在滚动,会获取到某一时刻视图应该所在的位置,刷新照片卷轴中mCurrX, mCurrY的值,并且返回true; 如果(mScroller.computeScrollOffset ()) { mScroller.getCurrY scrollTo (mScroller.getCurrX () ());//更新界面 postInvalidate (); } super.computeScroll (); } >之前<强>使用示例:
强>包com.liujian.chart;/* * *照片卷轴练习,一个简单的:viewpage * @author: liujian * @since: 2017/12/17 */公开课ScrollLayout延伸ViewGroup { 私人照片卷轴mScroller;//当前设备滑动的最小距离 私人int mTouchSlop; 私人int leftBorder;//布局内容的左边界 私人int rightBorder;//布局内容的右边界 私人mRawXDown浮动; 私人mRawXMove浮动; 私人mRawXLastMove浮动; 公共ScrollLayout(上下文语境){ 超级(上下文); initView(上下文); } 公共ScrollLayout(上下文语境,@Nullable AttributeSet attrs) { 超级(上下文,attrs); initView(上下文); } 公共ScrollLayout(上下文语境,@Nullable AttributeSet attrs, int defStyleAttr) { 超级(上下文、attrs defStyleAttr); initView(上下文); } 私人空间initView(上下文语境){ mTouchSlop=ViewConfiguration.get (getContext ()) .getScaledTouchSlop (); mScroller=new照片卷轴(getContext ()); } @Override 保护无效onMeasure (int widthMeasureSpec int heightMeasureSpec) { 超级。onMeasure (widthMeasureSpec heightMeasureSpec);//为ScrollLayout中的某一个子视图给出一个建议的测量大小和测量模式 measureChildren (widthMeasureSpec heightMeasureSpec); } @Override 保护无效onLayout(布尔改变,int, int, int, int b) { int childCount=getChildCount (); for (int i=0;我& lt;childCount;我+ +){ 视图视图=getChildAt(我); 视图。布局(我* view.getMeasuredWidth () 0 (i + 1) * view.getMeasuredWidth (), view.getMeasuredHeight ()); } leftBorder=getChildAt (0) .getLeft (); rightBorder=getChildAt (getChildCount () - 1) .getRight (); } @Override 公共布尔onInterceptTouchEvent (MotionEvent ev) { 开关(ev.getAction ()) { 案例MotionEvent.ACTION_DOWN: mRawXDown=ev.getRawX (); mRawXLastMove=mRawXDown; 打破; 案例MotionEvent.ACTION_MOVE: mRawXMove=ev.getRawX (); mRawXLastMove=mRawXMove; 浮动距离=数学。abs (mRawXMove mRawXDown);//左右滑动时,拦截子视图的触摸事件 如果(距离比;mTouchSlop) { 返回true; } 打破; 案例MotionEvent.ACTION_UP: 打破; } 返回super.onInterceptTouchEvent (ev); } @SuppressLint (“ClickableViewAccessibility”) @Override 公共布尔onTouchEvent (MotionEvent事件){ 开关(event.getAction ()) { 案例MotionEvent.ACTION_MOVE: mRawXMove=event.getRawX (); int distanceX=(int) (mRawXLastMove - mRawXMove);//对边界异常情况的处理 如果(getScrollX () + distanceX & lt;leftBorder) { scrollBy (leftBorder 0); } 如果(getScrollX () + getWidth () + distanceX祝辞rightBorder) { scrollBy (rightBorder - getWidth (), 0); } scrollBy (distanceX 0); mRawXLastMove=mRawXMove; 打破; 案例MotionEvent.ACTION_UP://当前所在页面的页面 int targetIndex=(getScrollX getWidth () + ()/2)/getWidth (); int dx=targetIndex * getWidth ()——getScrollX (); 日志。我(“标签”、“dx:“+ dx); 日志。我(“标签”,“getScrollX:“+ getScrollX ()); 日志。我(“标签”,“getWidth:“+ getWidth ());//第二步,调用startScroll()方法来初始化滚动数据并刷新界面 mScroller.startScroll (getScrollX (), 0, dx, 0); 无效(); 打破; } 返回super.onTouchEvent(事件); } @Override 公共空间computeScroll () { 如果(mScroller.computeScrollOffset ()) { mScroller.getCurrY scrollTo (mScroller.getCurrX () ()); 无效(); } } }Android自定义观点弹性滑动照片卷轴详解