We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
很久没有写博客了,今天决定把这个习惯找回来,毕竟自己总结的东西如果不整理记录下来,过段时间就会忘记。前几天发现ios系统的滚动布局可以支持双指连续下拉/上拉的操作,Android系统提供的控件没有实现这样的效果,决定自己写一个。
因为需要定制了一个可以上拉/下拉,松手后回弹效果的ScrollView(当然也可以是其他Layout),跟常用的下拉刷新的控件的实现原理类似,只不过加了一个多点触碰时的处理来实现双指下拉,不包含刷新和加载的部分。 具体方法分为以下几步: 1.继承ScrollView,在初始化函数中获取第一个子布局inner。 获取子布局inner,之后的滑动实际上是对inner的移动操作。
2.先说明一下:当inner布局不在初始位置上时,调用hide()方法,计算出inner当前位置y坐标与初始位置y坐标的差值,启动TimerTask线程,调用handle发送message来回调其中方法,此时会根据y坐标差值的大小来计算出inner移动的速度,调用inner的layout方法使其回到初始位置上,并且具有一定的弹性效果(因为速度是变化的)。
3.当inner不为空时,在dispatchTouchEvent添加自己的逻辑。
4.在commOnTouchEvent中实现手指滑动的反馈。 处理MotionEvent时需要注意: 4.1 在ACTION_DOWN的逻辑中记录下手指按下的y坐标,当布局回弹过程中,手指再次按下调用timer.cancel();来停止布局的移动,记录下当前mActivePointerId。 4.2 在ACTION_MOVE的逻辑中,考虑到多指触碰的情况,我们只能有一个参照point,首先获取我们的参照point的下标,获取当前参照手指的y坐标可以计算出参照手指滑动的距离,radio是布局和手指的移动距离的比例,利用该比例可以制造拉动时的阻尼效果。 deltaY是布局需要滑动的距离(单位是像素),其中我加了四个接口分别是在inner布局上滑和下滑以及靠近上或者靠近下时的回调。 isNeedMove()判断当前布局是否能够拖动,当ScrollView处于顶部下拉或者底部上拉时需要处理,其他情况为内部内容的滑动,是不需要拉动的。 拉动时在当前inner的位置基础上调用其layout函数进行移动。 4.3 在ACTION_POINTER_UP的逻辑中,这里是直处理多指触碰的关键,在多个触摸点存在的情况下,其中一个触摸点消失了时做判断,当只有两个手指时,参照触摸点抬起,此时需要进行参照触摸点的转换,因此实现双指连续拉动。 4.4 在ACTION_UP的逻辑中,触摸点都离开屏幕时出发调用hide()使inner回到初始位置。
5.接口
以上就是实现方法和原理说明,源码可以看这里
The text was updated successfully, but these errors were encountered:
No branches or pull requests
前言
很久没有写博客了,今天决定把这个习惯找回来,毕竟自己总结的东西如果不整理记录下来,过段时间就会忘记。前几天发现ios系统的滚动布局可以支持双指连续下拉/上拉的操作,Android系统提供的控件没有实现这样的效果,决定自己写一个。
实现思路
因为需要定制了一个可以上拉/下拉,松手后回弹效果的ScrollView(当然也可以是其他Layout),跟常用的下拉刷新的控件的实现原理类似,只不过加了一个多点触碰时的处理来实现双指下拉,不包含刷新和加载的部分。
具体方法分为以下几步:
1.继承ScrollView,在初始化函数中获取第一个子布局inner。
获取子布局inner,之后的滑动实际上是对inner的移动操作。
2.先说明一下:当inner布局不在初始位置上时,调用hide()方法,计算出inner当前位置y坐标与初始位置y坐标的差值,启动TimerTask线程,调用handle发送message来回调其中方法,此时会根据y坐标差值的大小来计算出inner移动的速度,调用inner的layout方法使其回到初始位置上,并且具有一定的弹性效果(因为速度是变化的)。
3.当inner不为空时,在dispatchTouchEvent添加自己的逻辑。
4.在commOnTouchEvent中实现手指滑动的反馈。
处理MotionEvent时需要注意:
4.1 在ACTION_DOWN的逻辑中记录下手指按下的y坐标,当布局回弹过程中,手指再次按下调用timer.cancel();来停止布局的移动,记录下当前mActivePointerId。
4.2 在ACTION_MOVE的逻辑中,考虑到多指触碰的情况,我们只能有一个参照point,首先获取我们的参照point的下标,获取当前参照手指的y坐标可以计算出参照手指滑动的距离,radio是布局和手指的移动距离的比例,利用该比例可以制造拉动时的阻尼效果。
deltaY是布局需要滑动的距离(单位是像素),其中我加了四个接口分别是在inner布局上滑和下滑以及靠近上或者靠近下时的回调。
isNeedMove()判断当前布局是否能够拖动,当ScrollView处于顶部下拉或者底部上拉时需要处理,其他情况为内部内容的滑动,是不需要拉动的。
拉动时在当前inner的位置基础上调用其layout函数进行移动。
4.3 在ACTION_POINTER_UP的逻辑中,这里是直处理多指触碰的关键,在多个触摸点存在的情况下,其中一个触摸点消失了时做判断,当只有两个手指时,参照触摸点抬起,此时需要进行参照触摸点的转换,因此实现双指连续拉动。
4.4 在ACTION_UP的逻辑中,触摸点都离开屏幕时出发调用hide()使inner回到初始位置。
5.接口
以上就是实现方法和原理说明,源码可以看这里
The text was updated successfully, but these errors were encountered: