【Android】【自定义View】MotionEvent getX()和getRawX()的区别

来源:互联网 发布:淘宝网运营模式是 编辑:程序博客网 时间:2024/05/17 18:12

下面是View跟随手指移动的案例,使用 getaowX和getX 两种获取坐标的方式

先是 getRawX()的方式

  @Override    public boolean onTouchEvent(MotionEvent event) {        float x = event.getRawX();        float y = event.getRawY();        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                lastX = x;                lastY = y;                break;            case MotionEvent.ACTION_MOVE:                int dx = (int) (x - lastX);                int dy = (int) (y - lastY);                layout(                        getLeft() + dx,                        getTop() + dy,                        getRight() + dx,                        getBottom() + dy                );                lastX = x;                lastY = y;                break;            case MotionEvent.ACTION_UP:                break;        }        return true;    }

再是getX()的方式

@Override    public boolean onTouchEvent(MotionEvent event) {        float x = event.getX();        float y = event.getY();        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                lastX = x;                lastY = y;                break;            case MotionEvent.ACTION_MOVE:                int dx = (int) (x - lastX);                int dy = (int) (y - lastY);                layout(                        getLeft() + dx,                        getTop() + dy,                        getRight() + dx,                        getBottom() + dy                );                break;            case MotionEvent.ACTION_UP:                break;        }        return true;    }

发现了 getRawX的方式比getX的方式,在Move中多了一步赋值,即:
lastX = x;
lastY = y;
可是完成的效果确实一样,这是为什么呢?
其实是这样的
getRawX:触摸点相对于屏幕的坐标
getX: 触摸点相对于按钮的坐标
这里写图片描述
可以这么认为:getRawX获取的是绝对坐标,而getX获取的是相对坐标
在getX()的做法里面,
layout(
getLeft() + dx,
getTop() + dy,
getRight() + dx,
getBottom() + dy
);
之后,view发生了位移,下一次getX()的值被修正了,所以无需再次赋值.

0 0
原创粉丝点击