要想实现滑动效果, 那就需要我们先了解 Android 中窗口坐标体系和屏幕的触控事件(MotionEvent).
一, 坐标系及触控事件
在 Android 中坐标系分两种:
1Android 坐标系: 以屏幕最左上角的顶点作为 Android 坐标系的原点, 从这个点向右是 X 轴正方向, 从这个点向下是 Y 轴正方向.
Android 坐标系
且 Android 系统提供了 getLocationOnScreen(intlocation[])方法来获取 Android 坐标系中点的位置, 另外在触控事件中使用 getRawX(),getRawY()方法获取的坐标也是 Android 坐标系中的坐标.
2视图坐标系: 视图坐标系的 X 轴, Y 轴与 Android 坐标系的一致, 只不过原点变成以父视图左上角为坐标原点.
视图坐标系
在触控事件中, 通过 getX(),getY()所获得的坐标就是视图坐标系中的坐标.
触控事件 --MotionEvent
首先了解下 MotionEvent 中封装的一些常用的事件常量, 它定义了触控事件的不同类型.
常用的事件常量
已经了解了触控事件的不同类型, 那我们又该怎么去获取呢? 其实很简单, 通过 event.getAction()方法就能获取, 且这个代码格式基本是固定的.
获取触控事件类型并筛选
二, 实现滑动的方法
1Layout 方法: 通过修改 View 的 left,top,right,bottom 四个属性来控制 View 的坐标.
图 1-1
图 1-2
注意: 使用绝对坐标系的时候, 在每次执行完 ACTION_MOVE 的逻辑后, 一定要重新设置初始坐标!!!
2offsetLeftAndRight()与 offsetTopAndBottom()
这个方法相当于系统提供一个对左右, 上下移动的 API 的封装.
图 2
3LayoutParams: 其保存了一个 View 的布局参数. 因此可通过它来动态修改一个布局的位置参数.
图 3
4scrollTo 和 scrollBy:scrollTo(x,y)表示移动到一个具体的坐标点 (x,y),scrollBy(dx,dy) 表示移动的增量为 dx,dy.
使用时, 有一点需要注意, 如果将 scrollBy 里的参数全设为正数的话, content 将向坐标轴负方向移动, 所以想要跟随手指移动而滑动的话, 必须将偏移量改为负值.
图 4
5Scroller: 通过 Scroller 类实现平滑移动, 而不是瞬间完成的移动.
a: 初始化 Scroller, 重写 computeScroll()方法, 实现模拟滑动
图 5-1
b:startScroll 开启模拟过程
图 5-2
实现 Scroll(滑动)的方法还有两种: 属性动画和 ViewDragHelper, 其中 ViewDragHelper 准备通过 QQ 滑动侧边栏 例子来说, 为了给大家一个好的消化过程, 所以放在下一篇文章.
这篇文章到这里就结束了, 希望能给大家带来收获!!!
来源: http://www.jianshu.com/p/252775d0d3c0