Android实现View的滑动系列二 -- 使用scrollBy()和scrollTo()方法

scrollBy()和scrollTo()方法

scrollBy()和scrollTo()的源码
 * 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);
    }

View有两个方法scrollBy()和scrollTo(),这两个方法移动的都是View的内容。

  • 如果是ViewGroup,比如LinearLayout,使用上述两个方法将会移动LinearLayout的整个内容,可以用于实现下拉刷新时整体内容的移动效果
  • 如果是View,比如TextView,那么移动的就是TextView的内容,可以用于实现TextView的字体滚动显示效果
  • scrollTo()使用的具体的坐标而scrollBy()使用的偏移量,scrollBy()默认偏移量是0,这两个方法的传入的坐标参考的都是调用此方法view的视图坐标系
  • 两个方法的调用会触发onScrollChanged()回调

实现View的滑动系列一 的效果,修改onTouchEvent部分代码:

 @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                int offsetX = x - lastX;
                int offsetY = y - lastY;
                //获取当前view的父view对象,需要强转成View对象去使用这两个方法
                View parent = (View) getParent();
                //偏移量为正给我们的视觉效果就是内容往左移动,为负值视觉效果就是内容在往右移动。
                //所以计算出偏移量是正值,我们期待的视觉效果是内容往右移动,所以需要加上负号,切记,切记!
                parent.scrollBy(-offsetX, -offsetY);
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        //想接受一个触摸事件的全部事件序列,此处必须返回true,
        //否则就只能接收到ACTION_DOWN事件
        return true;

关于View和其内容的关系理解

  • View可以理解是一个可见的视图,但是其内容可以比视图大。
    比如:view 我们设置其宽和高都是100dp,我们的内容宽和高大小是1000dp。我们肉眼可见的视图区域就是view的宽和高设置的大小就是100dp,但是我们实际的内容比这个大的多,我们通过监听view的触摸事件来让view的内容进行移动,然后我们就可以看到其他的内容。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/txksnail/article/details/80042765