关闭

Android中getX()、getRawX()、getScrollX()、scrollTo()、scrollBy()等的区别

标签: android
498人阅读 评论(0) 收藏 举报
分类:

一、getX()和getRawX()及getLeft()、getRight()等的区别

getLeft , getTop, getBottom, getRight表示控件在parent中的相对位置。

getX()是表示Widget相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值


getX()的不同点:

若是view用了自己的onTouch事件,即view.setOnTouchListener(),那么getX()和getY()获得的永远是view的触摸位置坐标(这两个值不会超过view的长度和宽度);

若是重写了Activity的onTouchEvent方法,这个时候获得的是屏幕点击位置的坐标。event.getX() 与 event.getRawX()获取的值是一样的。此时能获取触摸标题栏时的坐标位置,但不能获得触摸状态栏时的坐标位置。

在GridView中进行拖拽操作是,拖动Item时获取的getX不是相对于Item的坐标,而是相对于GridView的坐标。

上一张参考的图片,引用自:http://www.360doc.com/content/12/1109/14/7857928_246812407.shtml

这里附上MotionEvent中getRawX()的源码及View中getLeft()的源码:

/**
 * Returns the original raw X coordinate of this event.  For touch
 * events on the screen, this is the original location of the event
 * on the screen, before it had been adjusted for the containing window
 * and views.
 *
 * @see #getX(int)
 * @see #AXIS_X
 */
public final float getRawX() {
    return nativeGetRawAxisValue(mNativePtr, AXIS_X, 0, HISTORY_CURRENT);
}
/**
 * Left position of this view relative to its parent.
 *
 * @return The left edge of this view, in pixels.
 */
@ViewDebug.CapturedViewProperty
public final int getLeft() {
    return mLeft;
}

二、Android中View的getScrollX()、getScrollY()、scrollTo()等scrollBy()的含义

首先需要注意的是,scrollTo()和scrollBy()方法的调用不是改变View的位置,而是滑动View中的内容。

先看下View中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();
        }
    }
}

看注释可知道,scrollTo()方法表示设置自己的view滚动的位置,即移动内容到(x,y)坐标点,移动的是绝对距离。

再看View中scrollBy()的定义:

/**
 * 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);
}

由注释可知,scrollBy()方法表示移动自己的view滚动的位置,即在视图的X、Y方向上将内容各自移动x、y的距离,移动的是相对距离。

scrollTo(x,y):
x > 0表示内容从右往左移动到x坐标,反之从左往右移动到x坐标。
scrollBy(x,y):
x > 0表示内容从下往上移动x距离,反之从上往下移动x距离。

比如:scrollTo(100,0)表示内容向左移动到100的位置,为何传入的是100却要向左移呢?scrollTo(0,100)表示内容向上移动到100的位置呢?

因为,移动时,从我们用户角度(即以内容为参照物)来说,我们确实是向右移动到了x坐标为100的位置,但是系统是以内容所在的view为参照系的,即scrollTo(100,0)表示内容向左移动到(100,0)的位置,此时,获取的getScrollX为-100。scrollTo(0,100)表示内容向上移动到(0,100)的位置,此时,获取的getScrollY为-100


最后再附上View中getScrollX()和getScrollY,mScrollX和mScrollY的源码:

/**
 * 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;
}
 /**
 * The offset, in pixels, by which the content of this view is scrolled
 * horizontally.
 * {@hide}
 */
@ViewDebug.ExportedProperty(category = "scrolling")
protected int mScrollX;
/**
 * The offset, in pixels, by which the content of this view is scrolled
 * vertically.
 * {@hide}
 */
@ViewDebug.ExportedProperty(category = "scrolling")
protected int mScrollY;
1
0
查看评论

getRawX、getRawY与getX、getY、getScrollX、getScrollY,getTop,getLeft区别

1、getRawX、getRawY与getX、getY的区别这四个方法都返回一个float类型的参数,单位为像素(Pixel)。 getRawX()、getRawY()返回的是触摸点相对于屏幕的位置, 而getX()、getY()返回的则是触摸点相对于View的位置。 2、View中的ge...
  • sinat_29912455
  • sinat_29912455
  • 2016-04-06 11:46
  • 3076

【移动开发】View的scrollTo()和scrollBy()区别

首先,需要知道的是,View是可以延伸到屏幕之外的,可以想象一下ListVIew或GridView。也就是说View的尺寸可以超过屏幕的尺寸。View的大小就是onDraw()中Canvas画布的大小。Canvas可以做translate()、clipRec()t等变换,可以说Canvas是无边界的...
  • manoel
  • manoel
  • 2014-09-12 13:27
  • 14589

getRawX、getRawY和getX、getY的区别

区别最近在研究SwipeCard时,需要用到View的手势识别(GestureDetectorCompat),在GestureDetector的静态内部类SimpleOnGestureListener中有个onScroll(MotionEvent e1, MotionEvent e2, float ...
  • u011060103
  • u011060103
  • 2016-03-03 23:10
  • 2342

Android开发之getX,getRawX,getWidth,getTranslationX等的区别

努力,fighting!!
  • dmk877
  • dmk877
  • 2016-05-31 23:37
  • 10155

Android中View的scrollTo()和scrollBy()区别

转自:http://blog.csdn.net/manoel/article/details/39228593 首先,需要知道的是,View是可以延伸到屏幕之外的,可以想象一下ListVIew或GridView。也就是说View的尺寸可以超过屏幕的尺寸。View的大小就是onDraw()中...
  • jdsjlzx
  • jdsjlzx
  • 2016-01-05 14:40
  • 3262

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

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反。通过提供的api如getLeft , getTop, getBottom, getRight可以获得控件在parent中的相对位置。同时,也可以获得控件在屏幕中的绝对位置,详...
  • bigconvience
  • bigconvience
  • 2014-05-23 14:59
  • 69401

Android中scrollTo()和scrollBy()的区别以及Scroller源码解析

文章转自http://blog.csdn.net/crazy__chen/article/details/45896961。 滑动是我们在自定义控件时候经常遇见的难题,让新手们倍感困惑,这篇文章主要介绍Scroller类的源码,告诉打击这个到底有什么用,怎么使用它来控制滑动。另外,我还会结...
  • Samuel__Liu
  • Samuel__Liu
  • 2016-02-17 09:15
  • 1536

Android getx(),getRawX(),getTop()方法间的区别

public class Res extends Activity implements View.OnTouchListener {        ...
  • Tom_xiaoxie
  • Tom_xiaoxie
  • 2016-03-01 11:39
  • 1055

Android MotionEvent中getX()和getRawX()区别以及View坐标getLeft(),getTop()一点理解

最近在看一位大神写的可以拖拽移动的GridView的实现,里面有很多通过getX(),
  • diaomao357
  • diaomao357
  • 2014-06-19 00:15
  • 4442

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI。以下是android UI的结构示示意图:...
  • vipzjyno1
  • vipzjyno1
  • 2014-04-27 16:23
  • 49725
    个人资料
    • 访问:65677次
    • 积分:1002
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:1篇
    • 译文:2篇
    • 评论:6条
    博客专栏
    最新评论