博文中遇到的源码可以联系我。 qq:434638973
1.基础原理知识理解
滑动一个view,其实就是移动一个view,它的原理与动画效果的实现非常相似,都是通过不断地改变view的坐标来实现这一效果。就必须监听用户触摸事件,并更具事件传入的坐标,动态且不断地改变view的坐标,从而实现view跟随用户的滑动而滑动。在讲解如何实现滑动效果前需要了解一下android中的窗口坐标系和屏幕的触控事件-MotionEvent.
在安卓中,系统提供了很多的方法来获取坐标值,相对距离等等。方法虽然多,但是也给初学者带来了困惑,下面就总结一下:
可以分为两个类别:
view提供的获取坐标的方法,getTop(),getLeft,getRight,getBottom,这些方法获取的到的就是view自身的各边到父布局的边的距离。
MotionEvent提供的方法,getX,getY,getRawX,getRawY,前面两个方法获取点击事件距离控件的距离,后面两个是距离屏幕的距离。
2.实现滑动的方法总结
我们的目的就是让自定义的view随着手指在屏幕上的滑动而滑动。
1.用layout方法滑动
我们知道在对view进行绘制的时候,会调用onLayout()方法来设置显示的位置。同样,可以通过修改view的left,top,,,四个属性来控制view的坐标。我们重写onTouchEvent()方法,每次回调它的时候我们都获取一下触摸点的坐标。这里获取的方法是通过事件的event.getX,getY方法在case MotionEvent.Action_DOWN的时候,就记录触摸点的坐标,然后移动的时候就计算偏移量,然后调用layout方法传入四个参数,就是getLeft+偏移量,,,等等,,,,。
也可以使用绝对坐标系,就是event.getRawX,Y的方法,但是使用绝对坐标系的话,一定记住在每次执行完ACTION_MOVE的逻辑后,都要重新设置初始坐标,这样才能准确的获取偏移量。
2.当然这里layout控制移动的方法我们也可以换成offsetLeftAndRight(偏移量),offsetTopAndBottom(偏移量)。
3.用LayoutParamsLayoutParams保存了一个view的布局参数。因此可以在程序中通过改变LayoutParams来动态修改一个布局的位置参数,从而达到改变view位置的效果。计算偏移量的方法也和Layout方法中计算是一样,获取到偏移量之后,就可以通过setLayoutParams来改变其LayoutParams。这里需要注意的是,通过getLayoutParams方法获得的LayoutParams时需要根据父布局的类型来设置不同的类型。除了使用布局的LayoutParams之外,还可以使用ViewGroup.MaeginLayoutParams来实现这样一个功能。我们可以发现这个更加方便不需要考虑父布局类型,当然他们的本质都是一样。
4.scrollTo与scrollBy
前者表示移动到某个坐标点,后者是移动的增量dx,dy。如果在view里调用这样的方法实际上移动的是它的内容,所以我们在ViewGroup中调用,这样移动的才是它的全部子view。
记住scrollBy方法的参数如果为正数会像负方向移动,如果为负数才会将向坐标轴的正方向移动,因此要实现跟随手指移动而滑动的效果,就必须将偏移量改为负值。
5.Scroller
4提到了的方法我们自然要说一说scroller类,通过它我们可以实现平滑移动的效果,而不是瞬间移动完成的。
要如何使用呢,首先要初始化Scroller,然后重写computeScroll()方法,通常有模版来实现,接着就mScroller.startScroll()开启模拟过程,在ACTION_UP手指离开时,执行滑动过程,方法里的1.2参数分别为viewGroup.getScrollX(),Y,就是要滑动的的位置,3.4就是滑动完之后要返回的位置。最后记得执行invalidate()来进行重绘。只有使用scroller是在ACTION_UP状态下执行,其他方法都是在ACTION_MOVE下。