用于滑动),GestureDetector(网上有很多实现方法是复写onTouchEvent方法,把onTouchEvent方法写的很长,我不太喜欢这种方式,也推荐大家多用手势,很好用哦); 3.覆写computeScroll...(),onTouchEvent(MotionEvent event)(在这里把触摸屏幕的处理交给GestureDetector) 4.在computeScroll()里面完成实际的滚动 在开始具体的实现之前...这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。 上面的几个Scroller的方法,能够帮助我们实现滑动。..., new GestureListenerImpl()); } //startScroll之后没有真正移动,会自动调用这个函数实现移动 @Override public void computeScroll...() //其实,在此调用invalidate();亦可 postInvalidate(); } super.computeScroll(); } @Override
()方法,下面的代码基本是不会变化的: @Override public void computeScroll() { super.computeScroll(); if (mScroller.computeScrollOffset...我们可以这样理解:首先在startScroll()设置好了一堆初始值,之后调用了invalidate();让View重新绘制,这里又有一个很重要的点,在draw()中会调用computeScroll()...而在View类里面的computeScroll()是一个空的方法,需要我们去实现: /** * Called by a parent to request that a child update its...() { } 而在上面“三部曲”的第二部中,我们就已经实现了computeScroll()。...之后又调用了postInvalidate();,让View重绘并重新调用computeScroll()以此循环下去,一直到View滚动到指定位置为止,至此Scroller滚动结束。
int startX,int startY,int endx,int endY,int duration); invalidate();//在ViewGroup中,invalidate()方法会导致computeScroll...()方法的执行 //③在computeScroll()的方法中判断:mScroller是否结束,如果没有结束就调用scrollTo()让view处于正确的位置 @Override public...void computeScroll() { //computeScrollOffset()判断是否还在滚动,如果还在滚动,会获取到某一时刻view应该所在的位置,刷新Scroller中mCurrX...scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); //更新界面 postInvalidate(); } super.computeScroll...getScrollX(), 0, dx, 0); invalidate(); break; } return super.onTouchEvent(event); } @Override public void computeScroll
. */ public void computeScroll() { } 通过注释我们可以看到该方法又父类调用根据滚动的值去更新View,在使用Scroller的时候通常都要实现该方法。...继续往下跟发现在draw()方法中回去调用computeScroll(),而draw()方法会在父布局调用drawChild()的时候使用。...具体关联 通过上面两步大体能得到Scroller与View的移动要通过computeScroll()来完成,但是在究竟如何进行代码实现。...所以我们可以在computeScroll()方法中去判断一下当前是否已经滚动完成,如果没有滚动完成, 我们就去不断的获取当前Scroller的位置,根据这个位置,来把相应的View移动到这里。...所以我们调用invalidate方法去请求重绘,这样父类就会调用computeScroll postInvalidate(); } }
Scroller本身不能实现弹性,需要结合View的computeScroll()方法。...基本是固定的代码:先new 一个Scroller,然后重写computeScroll(),在写一个方法供调用,这里是smoothScrollTo。...computeScroll方法:根据时间计算当前一个滑动的距离,返回true表示滑动还没结束。 ?...所以,整个过程是:调用startScroll向Scroller传入滑动的距离和时间,然后调用了invalidate(),invalidate会导致重新绘制,即走draw(),然后走computeScroll...(),computeScroll中计算本次滚动的位置,数据保存在Scroller中,返回true表示滚动未结束。
super.onTouchEvent(event); // return true; } //5.2、使用Scroller, 循环:invalidate()---> onDraw() ---> computeScroll...() @Override public void computeScroll() { super.computeScroll(); //判断scroller
view 首先看看我们需要做些什么,自定义View要复写的方法有好几个,我们要复写的有: 1. onMeasure() 2. onLayout() 3. onTouchEvent() 4. computeScroll...void startScroll(int startX, int startY, int dx, int dy, int duration) 自己设定操作的时间,上面那个重载是用得默认值250. computeScroll...computeScroll()是一个空实现的函数,父控件调用用于更新子View,操作的是mScrollX和mScrollY,也就是移动偏移量。 ?...首先onTouchEvent()中调用了Scroller.startScroll()方法,该方法不涉及UI操作所以在后面调用了一次invalidate()让View去重绘,根据上面的computeScroll...既然手动调用invalidate()就会重绘,也就会调用到computeScroll(),里面再判断Scroller的差值计算是否完毕,未完毕则继续移动就这样循环直至偏移到最终坐标。
mScroller.getFinalY(), dx, dy, 3000); invalidate(); } // 5、重绘过程会调用computeScroll...真正调用scrollTo进行滚动 然后再进行重绘 @Override public void computeScroll() { // 判断滚动是否完成 true...// 本案例中 调用postInvalidate和invalidate都可以 invalidate(); } super.computeScroll...Scroller.gif 注意点 Scroller本身并不能实现View的滑动,本质还是让View重绘,重绘中调用View的computeScroll方法,在该方法中进行滑动方法的具体实现,然后再调用重绘函数
设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。...这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。...mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy); invalidate();//这里必须调用invalidate()才能保证computeScroll...()会被调用,否则不一定会刷新界面,看不到滚动效果 } @Override public void computeScroll() { //先判断mScroller滚动是否完成 if...mScroller.getCurrX(), mScroller.getCurrY()); //必须调用该方法,否则不一定能看到滚动效果 postInvalidate(); } super.computeScroll
5、Scroller和 View的computeScroll() 结合使用,实现view平滑的移动 public class MoveView extends View { private Scroller...context, attrs, defStyleAttr); } public MoveView(Context context) { super(context); } //重写computeScroll...方法 @Override public void computeScroll() { //view在onDraw的时候会调用此方法 super.computeScroll(); if (
Scroller 类要有下面三个步骤: 1、初始化 Scroller 类的对象:Scroller scroller = new Scroller(context) 2、重写要滑动的 View 的 computeScroll...方法来判断滑动是否完成,进行对应处理 @Override public void computeScroll() { super.computeScroll();...方法, * 因为只有通过这个方法才能间接地调用 computeScroll 方法,实现滑动 */ invalidate...方法:ViewDragHelper 内部还是通过 Scroller 来实现滑动的,所以需要实现 computeScroll 方法 4、处理 ViewDragHelper.Callback:这个回调是整个滑动的核心...方法,因为其内部也是通过这个类来实现滑动的 @Override public void computeScroll() { super.computeScroll();
mScroller.startScroll(startX,startY,dx,dy,duration); //重新绘制View invalidate(); } @Override public void computeScroll...() { // TODO Auto-generated method stub super.computeScroll(); boolean flag = mScroller.computeScrollOffset...然后在第20行调用invalidate方法,这个方法会导致SmoothScrollView重绘,从而调用draw方法之后又会调用computeScroll方法,在第24行可以看到这里重写了computeScroll...方法,因此调用invalidate方法最终会导致computeScroll方法被调用。
Context context){ curScreen = defaultScreen; mScroller = new Scroller(context); } @Override public void computeScroll...getChildCount()-1){ snapToScreen(curScreen+1); }else{ //主要是用来获取该滑动到哪个界面,最终调用的是invalid调用draw方法然后draw调用computeScroll...scroller.startScroll之后需要调用invalidate方法,然后调用ViewGroup的draw方法,然后调用computeScroll方法,在computeScroll方法里面调用Scroller.computeScrollOffset...()方法去判断有没有计算完,没计算完返回true,然后scrollto方法,再postInvalidate();方法重新执行computeScroll方法。
而是记录滑动相关量(滑动距离、滑动时间) 接着调用invalidate/postInvalidate()方法,请求View重绘,导致View.draw方法被执行 当View重绘后会在draw方法中调用computeScroll...方法,而computeScroll又会去向Scroller获取当前的scrollX和scrollY;然后通过scrollTo方法实现滑动;接着又调用postInvalidate方法来进行第二次重绘,和之前流程一样...break; } return super.onTouchEvent(event); } @Override public void computeScroll...() { // 重写computeScroll()方法,并在其内部完成平滑滚动的逻辑 if (mScroller.computeScrollOffset()) {
drawingWithRenderNode) { computeScroll(); sx = mScrollX; sy = mScrollY; } 程序会先调用,computeScroll...() { super.computeScroll(); if (mScroller.computeScrollOffset()) { Log.d(TAG, "computeScroll...所以代码可以改成这样: public void computeScroll() { super.computeScroll(); if (mScroller.computeScrollOffset...当然,在 computeScroll() 只是建议场合,如果你愿意,你可以在一个 while 循环中实现它。...@Override public void computeScroll() { super.computeScroll(); // 如果动画正在进行中,则返回 true,否则返回 false
分别算出当手指按下屏幕.移动,离开屏幕时滑块的位置 在移动的过程中,对滑块的位置进行限定,使滑块的位置不能超过指定的区域 在手指离开屏幕的事件中判定手指的位置,如果滑块没有到达最右边,那就让滑块回到开始的位置 通过重写computeScroll...; invalidate(); }else { //开启解锁 listener.onUnlock(this); } break; } invalidate(); return true; } //重写computeScroll...方法 调用invalidate之后 会调用draw draw会调用到这个computeScroll @Override public void computeScroll() { if (scroller.computeScrollOffset
scroller.startScroll(scrollX,scrollX,deltaX,deltaY,1000); invalidate(); } @Override public void computeScroll...可以理解是在他类的内部进行的滑动设想:你现在这个类中给他一个关于滑动的理想轨迹(从一个坐标,到另一个坐标和间隔时间),然后scroller根据这些进行规划(根据时间流逝的百分比算出应该滑动到的坐标),在重绘触发的回调函数computeScroll...总结一下就是,Scroller并不能实现View的滑动,它需要配合View的computeScroll()方法才能实现弹性滑动的效果,它不断让View重绘,而每一次重绘都会导致View进行进行小幅度滑动
onTouchEvent(MotionEvent event) { mDragHelper.processTouchEvent(event); return true; } 如果需要滑动动画 重写 computeScroll...() /** * 因为要在 DragHelper的中使用动画 */ @Override public void computeScroll() { super.computeScroll()...() { super.computeScroll(); if (mDragHelper.continueSettling(true)) { ViewCompat.postInvalidateOnAnimation...return true; } /** * 因为要在 DragHelper的中使用动画 */ @Override public void computeScroll...() { super.computeScroll(); if (mDragHelper.continueSettling(true)) { ViewCompat.postInvalidateOnAnimation
break; default: break; } //需要主动出发一次invalidate,之后再移动的时候自动走computeScroll...方法 invalidate(); } @Override public void computeScroll() { //滑动时候computeScrollOffset...scrollTo(0, mScroller.getCurrY()); postInvalidate(); } super.computeScroll
; break; case MotionEvent.ACTION_UP: startScroller(); break; } return true; } @Override public void computeScroll...我们需要调用invalidate()触发View的重绘,并覆写重绘会执行的方法computeScroll()。...在computeScroll()方法中调用Scroller的computeScrollOffset()计算当前时间动画应该移动的位置,返回值是动画是否在执行。
领取专属 10元无门槛券
手把手带您无忧上云