在Android 设备上,滑动几乎是应用的标配,不管是下拉刷新还是SlidingMenu,它们的基础都是滑动,就需要使用滑动来隐藏和显示一些内容,基于上述两点,可以知道,滑动在Android 开发中具有很重要的作用,不管一些滑动效果多么绚丽,归根揭底,它们都是由不同的滑动外加一下特效所组成的,不管一些滑动效果多么绚丽,归根揭底,它们都是由不同的滑动外加一些特效所组成的,因此,掌握滑动的方法是实现绚丽的自定义控件的基础,通过三种方式可以实现View的滑动:第一种是通过View本身提供的scrollTo/scrollBy方法来实现滑动,第二种式提供动画给View施加平移效果来实现滑动,第三种是通过改变View的layoutParams使得View重新布局从而实现滑动,从目前来看,常见的滑动方式就这么三种:
使用scrollTo/scrollBy
为了实现View的滑动,View提供了专门的方法来实现这个功能,那就是scrollTo和scrollBy,我们先来看看这两个方法的实现,如下所示:
从上面的源码可以看出,scrollBy实际上也是调用了scrollTo方法,它实现了基于当前位置的相对滑动,而scrollTo则实现了基于所传递参数的绝对滑动,这个不难理解,利用scrollTo和scrollBy来实现View的滑动,这不是一件困难事,但是我们要明白滑动过程中View内部的两个属性mScrollX和mScrollY的改变规则,这两个属性可以通过getScrollX和getScrollY方法分别得到,这里先简要概括一下,在滑动过程中,mScrollX的值总是等于View左边缘和View内容左边缘在水平方向的距离,而mScrollY的值总是等于View上边缘和View内容上边缘在竖直方向的距离.View边缘是指View的位置,由四个顶点组成,而View内容边缘是值View中的内容的边缘,scrollTo和scrollBy只能改变View内容的位置而不能改变View在布局中的位置.mScrollX和mScrollY的单位为像素,并且当View左边缘在View内容左边缘的右边时,mScroll为正值,反之为负值;当View上边缘在View内容上边缘的下边时,mScrollY为正值,反之为负值,换句话说,如果从左向右滑动,那么mScrollX为负值,反之为正值,如果从上往下滑动,那么mScrollY为负值,反之为正值.
使用动画
通过动画我们能够让一个View进行平移,而平移就是一种滑动动画,使用动画来移动View,主要是操作View的translationX和translationY属性,既可以采用传统的View动画,也可以采用属性动画.
采用View动画的代码:
采用属性动画
使用动画来做View的滑动需要注意一点,View动画是对View的影响最操作,它并不能真正改变View的位置参数,包括宽高,并且如果希望动画后的状态得以保留还必须将fillAfter属性设置为true,否则动画完成后其动画结果会消失,比如我们要把View向右移动100像素,如果fillAfter为false,那么在动画完成的一刹那,View会瞬间恢复到动画前的状态,如果fillAfter为true,在动画完成后,View会停留在距原始位置100像素的右边,使用属性动画并不会存在上述问题.
改变布局参数
如果我们想把Button向右平移100px,我们只需将这个Button的LayoutParams里面的marginLeft参数的值增加100px.
通过改变LayoutParams的方式去实现View的滑动同样是一种很灵活的方法,需要根据不同情况去做不同的处理
各种滑动方式的对比
1 scrollTo/scrollBy这种方式,它是View提供的原生方式,其作用是专门用于View的滑动,它可以比较方便的实现滑动效果并且不影响内部元素的单击事件,但是它的缺点也是很显然的:它只能滑动View的内容,并不能滑动View本身
2 通过动画来实现View的滑动,这要分情况,如果是Android 3.0 以上并采用属性动画,那么采用这种方式没有明显的缺点,如果是使用View动画或者在Android 3.0以下使用属性动画,均不能改变View本身的属性,在实际使用种,如果动画元素不需要影响用户的交互,那么使用动画来做滑动式比较合适的,否则就不合适,但是动画有一个明显的优点,那就是一些复杂的效果必须要通过动画才能实现
3 改变布局这种方式,它除了使用起来麻烦点以外,也没有明显的缺点,它的主要适用对象是一些具有交互性的View,因为这些View需要和用户交互,直接通过动画去实现会有问题,这个时候我们可以直接使用改变布局参数的方式去使用
a scrollTo/scrollBy :操作简单,适合对View内容的滑动
b 动画: 操作简单,主要适应于没有交互的View和实现复杂的动画效果
c 改变布局参数:操作稍微复杂,适用于有交互的View
网友评论