view的滑动讲解

来源:互联网 发布:数据库开发工具有哪些 编辑:程序博客网 时间:2024/06/05 01:56

在Android应用中,view的滑动几乎是标配;比如上拉加载,下拉刷新,slidingmenu它们都需要滑动,从另一个方面来说,因为手机屏幕较小,想要显示更多的内容,就需要使用滑动来隐藏或者展示一些内容,基于上边两点我们可以知道滑动在Android开发中具有很重要的作用。掌握滑动的方法是实现绚丽自定义控件的基础。常见的滑动就这么三种,下面我们来一一分析。

1.使用scrollTo和scrollBy

为了实现view的滑动,系统提供了两个方法,就是scrollTo和scrollBy,我们来看看两个方法的实现:

/** * Set the scrolled position of your view. This will cause a call to * {@link #onScrollChanged(int, int, int, int)} and the view will be * invalidated. * @param x the x position to scroll to * @param y the y position to scroll to */public void scrollTo(int x, int y) {    if (mScrollX != x || mScrollY != y) {        int oldX = mScrollX;        int oldY = mScrollY;        mScrollX = x;        mScrollY = y;        invalidateParentCaches();        onScrollChanged(mScrollX, mScrollY, oldX, oldY);        if (!awakenScrollBars()) {            postInvalidateOnAnimation();        }    }}
/** * Move the scrolled position of your view. This will cause a call to * {@link #onScrollChanged(int, int, int, int)} and the view will be * invalidated. * @param x the amount of pixels to scroll by horizontally * @param y the amount of pixels to scroll by vertically */public void scrollBy(int x, int y) {    scrollTo(mScrollX + x, mScrollY + y);}
从源码可以看出scrollBy也调用了scrollTo方法实现的,前者实现了view基于当前位置的相对滑动,后者实现了view基于所传递参数的绝对滑动。用他们来实现view的滑动并不难,但是我们要明白滑动过程中mscrollx和mscrolly的改变规则。这两个属性分别通过getscrollx()和getscrolly()获得,mscrollx的值总等于view左边缘和view内容左边缘在水平方向上的距离。而mscrolly总等于view上边缘和view内容上边缘之间的竖直距离。view边缘是指view的四个顶点组成,view内容边缘是指view的内容的边缘,scrollTo和scrollBy只能改变vie内容的位置,而不能改变view在布局中的位置,mscrollx和mscrolly的单位为像素,只有view的左边缘在view内容左边缘的右边时Mscrollx为正,否则为负,当view上边缘在view内容上边缘的下边时,mscrolly为正,反之为负。也就是说从左往右划mscrollx为负值,反之为正,从上往下划mscrolly为负值,反之为正。以下图带表滑动过程
 
  
使用动画
使用动画我们能将一个view进行平移,而平移就是一种滑动,使用动画来移动view,主要操作view的translationx和translationy属性,既可以采用传统的动画,也可以采用属性动画。如果采用属性动画,为了兼容3.0以下的版本,需要采用开元动画库nineoldandroids(http://nineoldandroids.com/).采用view动画的代码如下所示:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"    android:fillAfter="true"    android:zAdjustment="normal" >    <!-- 把view在100毫秒内从原始位置向右下角移动100个像素 -->    <translate        android:duration="100"        android:fromXDelta="0"        android:fromYDelta="0"        android:interpolator="@android:anim/linear_interpolator"        android:toXDelta="100"        android:toYDelta="100" /></set>
如果采用属性动画,那就更简单了,以下是把view在100毫秒内从原位置向右移动100像素。

ObjectAnimator.ofFloat(target, "translationx", 0, 100).setDuration(100).start();

使用动画来做view的滑动需要注意一点,他移动的是view的影像,它并不能真正改变view的未知参数。包括宽高,并且如果需要改变动画后状态能够保存,那么我们必须把fillafter设置为true,否则动画完成后,其动画效果消失。使用属性动画并不存在上述问题,但是Android3.0以下无法使用属性动画,这个时候我们可以使用动画兼容库nineoldandroids来实现属性动画,尽管如此,Android3.0以下的手机实现属性动画也是通过Android的view动画。

上边提到的view动画不能真正改变view的位置,这会带来一个严重的问题,因为当移动之后,你单击并不能触发onclick事件,而单击原始位置仍然可以触发原来的事件,对于这种问题,我们可以先在欲到达的位置设置一个新控件,和移动的目标控件一模一样,当目标控件移动到位置时,影藏目标控件,显示新控件就好了。


改变布局参数

第三种方法就是改变布局参数,如向右移100px,我们只要设置layoutparams的margainleft设置为100px就好了;

总结之后如下所示:

scrollTo、scrollBy使用简单,适合对view的内容的滑动。

动画:使用简单,主要用于没有交互的view和复杂动画效果;

布局参数:操作复杂,适用于有交互的view



0 0
原创粉丝点击