Android开发Android技术知识安卓资源收集

View的事件体系(二)实现View滑动的三种方式

2016-11-23  本文已影响213人  MryU93

实现View滑动的三种方式:

1.通过动画给View增加平移滑动的效果

2.通过改变View的LayoutParams使得View重新布局

3.通过View自身提供的ScrollTo/scrollBy方法实现滑动

一.通过动画给View增加平移滑动的效果

使用动画移动View,主要是操作View的translationX和translationY属性,既可以采用传统的View动画,也可以采用属性动画

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

二.通过改变View的LayoutParams使得View重新布局

通过改变布局属性来移动View,即改变LayoutParams。

三.通过View自身提供的ScrollTo/scrollBy方法实现滑动

在实际的开发中我们真正地使用scrollTo()和scrollBy()来实现View的滑动的时候并不多。因为这两个方法产生的滑动是不连贯的,跳跃的,闪烁的,最终的效果也不够平滑。所以,我们多采用系统提供的工具类Scroller来实现View的滚动效果。

1.认识mScrollX和mScrollY

获取mScrollX的值,mScrollY的值:

/**
 mScrollX和mScrollY表示:View的内容(content)相对于View本身在水平或垂直方向的偏移量. 
**/
public final int getScrollX() {
    return mScrollX;
}

public final int getScrollY() {
    return mScrollY;
}

mScrollX和mScrollY的变化规律:

(1)、mScrollX的值总是等于View左边缘和View内容左边缘在水平方向的距离(mScrollX=X1-X2,,其中X1,表示View的左边缘,其中X2,表示View内容的左边缘),当View内容的左边缘位于View的左边缘的左边时,mScrollX大于零,即mScrollX为正值,反之为负值;(图中绿色的代表内容区域)


(2)、mScrollY的值总是等于View上边缘和View内容上边缘在竖直方向的距离(mScrollY=Y1-Y2,,其中Y1,表示View的上边缘,其中Y2,表示View内容的上边缘),当View内容的上边缘位于View的上边缘的上边时,mScrollY大于零,即mScrollY为正值,反之为负值;

/**
 * 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);
}

scrollTo(int x, int y)

scrollTo()是实现View滚动的核心,调用该方法使得View相对于其初始位置滚动某段距离。在该方法内部将输入参数x,y分别赋值给用于表示View在X方向滚动距离的mScrollX和表示View在Y方向滚动距离的mScrollY,然后调用onScrollChanged()并且刷新重绘View。在后续的操作中调用view.getScrollX()或view.getScrollY()可以很容易地得到mScrollX和mScrollY

scrollBy(int x, int y)

在现有的基础上继续移动视图的内容.

结论:

1.mScrollX和mScrollY分别表示View在X、Y方向的滚动距离

2.scrollTo( )表示View相对于其初始位置滚动某段距离。
由于View的初始位置是不变的,所以如果利用相同输入参数多次调用scrollTo()方法,View只会出现一次滚动的效果而不是多次。

3.scrollBy( )表示在mScrollX和mScrollY的基础上继续滚动。

参考:

*****站在源码的肩膀上全解Scroller工作机制

上一篇下一篇

猜你喜欢

热点阅读