Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反。通过提供的api如getLeft,getTop,getBottom,getRight可以获得控件在parent中的相对位置。同时,也可以获得控件在屏幕中的绝对位置,详细用法可参考android应用程序中获取view的位置

当我们编写一些自定义的滑动控件时,会用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY()。由于常常会对函数getScrollX(), getScrollY()返回的值的含义产生混淆,尤其是正负关系,因此本文将使用几幅图来对这些函数进行讲解以方便大家记忆。

注意:调用View的scrollTo()和scrollBy()是用于滑动View中的内容,而不是把某个View的位置进行改变。如果想改变莫个View在屏幕中的位置,可以使用如下的方法。

调用public void offsetLeftAndRight(int offset)用于左右移动方法或public void offsetTopAndBottom(int offset)用于上下移动。

如:button.offsetLeftAndRignt(300)表示将button控件向左移动300个像素。


scrollTo(int x, int y)是将View中内容滑动到相应的位置,参考的坐标系原点为parent View的左上角。

调用scrollTo(100, 0)表示将View中的内容移动到x = 100, y = 0的位置,如下图所示。注意,图中黄色矩形区域表示的是一个parent View,绿色虚线矩形为parent view中的内容。一般情况下两者的大小一致,本文为了显示方便,将虚线框画小了一点。图中的黄色区域的位置始终不变,发生位置变化的是显示的内容。


同理,scrollTo(0, 100)的效果如下图所示:


scrollTo(100, 100)的效果图如下:


若函数中参数为负值,则子View的移动方向将相反。

scrollBy(int x, int y)其实是对scrollTo的包装,移动的是相当位置。scrollTo(int x, int y)的源码和scrollBy(int x, int y)源码如下所示.

/**     * 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<pre name="code" class="java">    /**     * 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();            }        }    }

/* @param y the amount of pixels to scroll by vertically */
public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); }


 可见,mScrollX和mScrollY是View类中专门用于记录滑动位置的变量。这两个函数最终调用onScrollChanged()函数,感兴趣者可以参考他们的源代码。  

理解了scrollTo(int x, int y)和scrollBy(int x, int y)的用法,就不难理解getScrollX() 和getScrollY()。这两个函数的源码如下所示:

/**     * Return the scrolled left position of this view. This is the left edge of     * the displayed part of your view. You do not need to draw any pixels     * farther left, since those are outside of the frame of your view on     * screen.     *     * @return The left edge of the displayed part of your view, in pixels.     */    public final int getScrollX() {        return mScrollX;    }

/**     * Return the scrolled top position of this view. This is the top edge of     * the displayed part of your view. You do not need to draw any pixels above     * it, since those are outside of the frame of your view on screen.     *     * @return The top edge of the displayed part of your view, in pixels.     */    public final int getScrollY() {        return mScrollY;    }



更多相关文章

  1. android APK Expansion Files
  2. AsyncTask的使用及源码分析
  3. [android] 百度地图开发 (三).定位当前位置及getLastKnownLocati
  4. android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理 (1)
  5. android中引用项目工程中的sqlite文件
  6. Android之Zygote介绍
  7. fix Android(安卓)building error on ubuntu 11.10
  8. Android的PopupWindow的使用,根据点击位置显示弹窗
  9. Android(安卓)多个Activity间对象共享

随机推荐

  1. Android Obex 规范
  2. android GridView(网格视图)
  3. android include 使用
  4. android之将图片转化为圆形图片
  5. adt-bundle import android工程出现错误
  6. Android 代码生成界面Sample
  7. Android webView 使用back功能返回以前浏
  8. Android 动态隐藏显示导航栏,状态栏
  9. Android 中保存图片的代码
  10. Android 跳转Activity并通过Bundle对象传