美文网首页Android开发Android技术知识安卓资源收集
View的事件体系(二)实现View滑动的三种方式

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

作者: MryU93 | 来源:发表于2016-11-23 17:48 被阅读213次

    实现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滑动的三种方式

        本文链接:https://www.haomeiwen.com/subject/lbuvpttx.html