Android自定义观点弹性滑动照片卷轴详解

  

本文实例为大家分享了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自定义观点弹性滑动照片卷轴详解