读书笔记之安卓实现滑动的几种方法

博文中遇到的源码可以联系我。 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下。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值