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

实现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工作机制

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是View View 是 Android 中所有控件的基类。 View的位置参数 View 的位置由它的四个顶...
    acc8226阅读 1,246评论 0 7
  • 开发中,为了增加更多炫丽的效果,我们经常在应用中添加滑动效果,今天就来分析一下 View 中滑动效果的实现原理以及...
    任教主来也阅读 3,096评论 0 14
  • 第3章 View的事件体系 [TOC] 3.1 View基础知识 1. View的位置参数 首先来认识一下View...
    反复横跳的龙套阅读 1,069评论 0 5
  • 内容是博主照着书敲出来的,博主码字挺辛苦的,转载请注明出处,后序内容陆续会码出。 当了解了Android坐标系和触...
    Blankj阅读 6,726评论 3 61
  • 四月里一个睛朗的早晨,我在原宿的一条巷子里,和一位100%的女孩擦肩而过. 并不是怎样漂亮的女孩,也没穿什么别致的...
    DrTony阅读 213评论 0 0