View的深入浅出(二)View的滑动

简介

在Android设备上,滑动几乎是应用的标配,可以说是所有app上都会有滑动事件,像是下拉刷新,上拉加载更多,侧拉菜单等,都是基础的一些滑动事件,从另一个角度来看,Android手机由于屏幕比较小,为了给用户展示更多的的内容,就需要用滑动来隐藏和显示一些内容,综上所述,滑动在Android开发中具有很重要的作用,不管一些滑动效果多么绚丽,归根到底,它们都是由不同的滑动加上一些特效组成的,因此,掌握滑动的方法是实现绚丽的自定义控件的基础.
通过三种方式可以实现View的滑动:
1,通过View本身提供的scrollTo/scrollBy方法来实现滑动
2,通过动画给View施加平移效果来实现滑动
3,通过改变View的LayoutParams使View重新布局从而实现滑动

一,使用scrollTo/ScrollBy

为了实现View的滑动,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方法,它实现了基于当前位置的相对滑动,而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内容左边缘时,mScrollX为正值,反之则为负值,当View上边缘在View内容上边缘的下边时,mScrollY为正值,反之为负值,话句话说:如果从左向右滑动mScrollX为负值,如果从上往下滑动,那么mScrollY为负值,反之则为正值.

使用动画

通过动画我们也能让View平移,而平移就是一种滑动,使用动画来移动View主要操作的是View的translationX和transactionY属性,既可以采用View的补间动画,也可以采用属性动画,如果采用属性动画的话,为了能够兼容3.0以下的版本,需要采用开源动画库,nineoldandroids
采用动画的代码如下,这个动画可以在100ms将一个View从原始位置向右下移动100个像素

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:zAdjustment="normal">  
    <translate  
        android:duration="100"  
        android:fromXDelta="0"  
        android:fromYDelta="0"  
        android:repeatCount="2"  
        android:interpolator="@android:anim/linear_interpolator"  
        android:toXDelta="100"  
        android:toYDelta="100" />  
</set>  

如果是采用属性动画,就更简单了,以下代码可以将一个View在100ms从原始位置向右下平移100像素

ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration(100).start();

使用补间动画来做View的滑动需要注意一点:View动画是对View的影像做操作,他并不能真正的改变View的位置参数,包括宽高,并且如果希望动画后的状态得以保留,还必须将fillAlfter属性设置为true,否则动画完成后其动画结果会消失,
如果需要View的属性也跟着动画移动,就需要使用属性动画,属性动画才是真正意义上将View的属性发生变化,但是属性动画是Android3.0后才有的,在Android2.2上是无法兼容的,这点需要注意

改变布局参数

改变View的布局参数是实现View滑动的第三种方法,
改变布局参数,即改变layoutParams,这个比较好理解,比如我们先把一个Button向右平移100px,我们只要将这个Button的LayoutParams里的marginLeft参数的值增加100px即可,是不是很简单,还有一种情形,为了达到移动Button的目的,我们可以在Button左边放置一个空的View这个View的默认宽度是0,当我们需要向右移动Button时,只需要重新设置这个View的宽高即可,当View的宽高增大时,(假设Button的父容器是水平方向的LinearLayout),Button就会自动被挤向右边,即实现了向右平移的效果,如何重新设置一个View的LayoutParams呢?

MarginLayoutParams params = (MarginLayoutParams)mButton1.getLayoutParams();
params.width+= 100;
params.leftMargin += 100;
mButton1.requestLayout();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值