getX,getY,getScrollX,getScrollY,ScrollTo(),ScrollBy()辨析

前言:前两天看了自定义控件,其中有一些东西我觉得有必要深入理解一下
以下图为例:

getX(),getY()返回的是触摸点A相对于view的位置
getRaw(),getRawY()返回的是触摸点B相对于phone(屏幕)的位置。

scrollTo是将View中的内容移动到指定的坐标x,y处,此x,y是相对于View的左上角来说,而不上屏幕的左上角。
当ScrollTo(-30,50)时,它从正中心移动到了右上方

可能有些人对此有疑问,按照惯性思维,view中的内容应该是移动到左上方的,我们点进去,看源码是怎么实现的?

 protected int mScrollX;//视图内容相对于视图起始坐标X轴方向的偏移量
 protected int mScrollY;//视图内容相对于视图起始坐标Y轴方向的偏移量
  public final int getScrollX() {
        return mScrollX;
    }
 public final int getScrollY() {
        return mScrollY;
    }

 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();
            }
        }
    }
//onScrollChanged()中的方法实现
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        notifySubtreeAccessibilityStateChangedIfNeeded();

        if (AccessibilityManager.getInstance(mContext).isEnabled()) {
            postSendViewScrolledAccessibilityEventCallback(l - oldl, t - oldt);//偏移量-传入坐标参数
        }
    }

首先我们要确立一点View的起始坐标(0,0)在View的左上角位置。
通过源码我们可以随便代入一下例如假设mScrollX=100,mScrollY=100,
当调用ScrollTo(-30,50)时,
l-oldl=100-(-30)=130,t-oldt=100-50=50,
所以它实际移动到的位置是(130,50),现在是不是明白了上图中view内容为什么往上右上方移动了

接下来我们再看看getScrollX()和getScrollY(),额,我们惊喜的发现——这两个方法的源码在上面
它们的返回值是mScrollX和mScrollY.
scrollTo和scrollBy
scrollTo(x,y):相对于初始位置的移动,此x,y是相对于View的左上角
scrollBy(x,y):相对于上次移动的最后位置移动,改变的是View中的相对位置,参数x,y为距离上一次的相对位置
两者移动的都是view的内容,view本身是不移动的。
嘿嘿!perfect

原文地址:https://www.cnblogs.com/dearnotes/p/12064376.html

时间: 2024-10-12 22:38:30

getX,getY,getScrollX,getScrollY,ScrollTo(),ScrollBy()辨析的相关文章

图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

Android系统手机屏幕的左上角为坐标系,同一时候y轴方向与笛卡尔坐标系的y轴方向想反.通过提供的api如getLeft , getTop, getBottom, getRight能够获得控件在parent中的相对位置.同一时候.也能够获得控件在屏幕中的绝对位置,具体使用方法可參考android应用程序中获取view的位置 当我们编写一些自己定义的滑动控件时,会用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY().因为经常会对函数ge

Android View的scrollTo(),scrollBy(),getScrollX(),getScrollY()

原文:图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

andorid 与滑动相关的一些知识---getscrollY onscrollchange() scrollby scrollto等

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反.通过提供的api如getLeft , getTop, getBottom, getRight可以获得控件在parent中的相对位置.同时,也可以获得控件在屏幕中的绝对位置,详细用法可参考android应用程序中获取view的位置 当我们编写一些自定义的滑动控件时,会用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY().由于常常会对函数getScroll

Android scrollTo() scrollBy() Scroller讲解及应用

版本:1.0 日期:2014.6.17  2014.6.18 版权:© 2014 kince 转载注明出处 scrollTo() .scrollBy()及 Scroller在视图滑动中经常使用到,比如最常见的Launcher就是用这种方式实现.为了更加明了的理解,还是去看一下源码.在View类中,scrollTo的代码如下: /** * Set the scrolled position of your view. This will cause a call to * {@link #onSc

Android MotionEvent getX() getY() getRawX() getRawY() and View getTop() getLeft()

getRowX:触摸点相对于屏幕的坐标getX: 触摸点相对于按钮的坐标getTop: 按钮左上角相对于父view(LinerLayout)的y坐标getLeft: 按钮左上角相对于父view(LinerLayout)的x坐标getRight():等同于下面的计算:getLeft()+getWidth(). 当你触到按钮时,x,y是相对于该按钮左上点的相对位置.而rawx,rawy始终是相对于屏幕的位置getX()和getY()获得的永远是view的触摸位置坐标(这两个值不会超过view的长度和

Android scrollTo() scrollBy() Scroller解说及应用

版本号:1.0 日期:2014.6.17  2014.6.18 版权:? 2014 kince 转载注明出处 scrollTo() .scrollBy()及 Scroller在视图滑动中常常使用到.比方最常见的Launcher就是用这种方式实现. 为了更加明了的理解.还是去看一下源代码.在View类中.scrollTo的代码例如以下: /** * Set the scrolled position of your view. This will cause a call to * {@link

scrollTo , scrollBy区别

View视图中scrollTo 与scrollBy这两个函数的区别 . 首先 ,我们必须明白在Android View视图是没有边界的,Canvas是没有边界的,只不过我们通过绘制特定的View时对 Canvas对象进行了一定的操作,例如 : translate(平移).clipRect(剪切)等,以便达到我们的对该Canvas对象绘制的要求 , 我们可以将这种无边界的视图称为“视图坐标”-----它不受物理屏幕限制.通常我们所理解的一个Layout布局文件只是该视 图的显示区域,超过了这个显示

Android中View的getX,getY...

Android坐标系的理解直接关系到后面你Android进阶部分的学习,如果没有夯实的基础,你自定义View时就会有种欲求不满,欲罢不能——想搞懂却又觉得难,想放弃又觉得舍不得. Android中的坐标系以及获取坐标的方法 Android中有两种坐标系,分别称之为Android坐标系和视图坐标系.而对应的也有一些相关的方法可以获取坐标系中的坐标值.只有搞清楚这些区别,才能在实现的时候不至于出错或者得不到你想要的效果. 一.Android坐标系和视图坐标系 (1)Android坐标系 先来看一看A

MotionEvent的getX(),getY()与getRawX(),getRawY()区别

getX()是表示Widget相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕),getY(),getRawY()一样的道理如果你的某个Activity中实现OnTouchListener接口,需要重写 onTouch(View view,MotionEvent event) 这个方法, getRawX()和getRawY()获得的是相对屏幕的位置,getX()和getY(