android scrollTo 方法为什么传负值往正方向走

最近做的demo里面用到scrollto  和scroller  发现传递负值的时候 view才往坐标轴的正方向滚动

很不理解,因为scrollto的注释写的是

* @param x the x position to scroll to

  * @param y the y position to scroll to

 查了半天view的代码

找到一个可能是原因的地方:代码如下(只是个人猜的)


/**

     * Mark the area defined by the rect (l,t,r,b) as needing to be drawn.
     * The coordinates of the dirty rect are relative to the view.
     * If the view is visible, {@link #onDraw(android.graphics.Canvas)}
     * will be called at some point in the future. This must be called from
     * a UI thread. To call from a non-UI thread, call {@link #postInvalidate()}.
     * @param l the left position of the dirty region
     * @param t the top position of the dirty region
     * @param r the right position of the dirty region
     * @param b the bottom position of the dirty region
     */
    public void invalidate(int l, int t, int r, int b) {
        if (skipInvalidate()) {
            return;
        }
        if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS) ||
                (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID ||
                (mPrivateFlags & INVALIDATED) != INVALIDATED) {
            mPrivateFlags &= ~DRAWING_CACHE_VALID;
            mPrivateFlags |= INVALIDATED;
            mPrivateFlags |= DIRTY;
            final ViewParent p = mParent;
            final AttachInfo ai = mAttachInfo;
            //noinspection PointlessBooleanExpression,ConstantConditions
            if (!HardwareRenderer.RENDER_DIRTY_REGIONS) {
                if (p != null && ai != null && ai.mHardwareAccelerated) {
                    // fast-track for GL-enabled applications; just invalidate the whole hierarchy
                    // with a null dirty rect, which tells the ViewAncestor to redraw everything
                    p.invalidateChild(this, null);
                    return;
                }
            }
            if (p != null && ai != null && l < r && t < b) {
                final int scrollX = mScrollX;
                final int scrollY = mScrollY;
                final Rect tmpr = ai.mTmpInvalRect;
                tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY);
                p.invalidateChild(this, tmpr);

            }
        }

    }

If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future

就是说在ondraw之前调用了这个方法 而且给view了一个指定的矩形框

而矩形框的值是这样设置的

  final int scrollX = mScrollX;
                final int scrollY = mScrollY;
                final Rect tmpr = ai.mTmpInvalRect;
                tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY);
                p.invalidateChild(this, tmpr);

所以scrollto需要传递负值 要不然这里的矩形框区域的 坐标系会往负方向移动


所以view的scrollto方法的注释写的我有点不明白


android scrollTo 方法为什么传负值往正方向走,布布扣,bubuko.com

android scrollTo 方法为什么传负值往正方向走

上一篇:Android 自定义控件


下一篇:android-circlebutton介绍