天天看点

getX和getRawX

今天在做一个关于拖动button的小demo,看到里面有getX和getRawX。就写了个测试来看看两者有什么区别。

布局文件就一个button

代码如下:

button.setOnTouchListener(new OnTouchListener() {
            int lastX, lastY;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action) {
                case MotionEvent.ACTION_DOWN:
                    lastX = (int) event.getRawX();
                    lastY = (int) event.getRawY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    int dx = (int) event.getRawX() - lastX;
                    int dy = (int) event.getRawY() - lastY;

                    int l = v.getLeft() + dx;
                    int b = v.getBottom() + dy;
                    int r = v.getRight() + dx;
                    int t = v.getTop() + dy;

                    if (l < 0) {
                        l = 0;
                        r = l + v.getWidth();
                    }
                    if (t < 0) {
                        t = 0;
                        b = t + v.getHeight();
                    }
                    if (r > width) {
                        r = width;
                        l = r - v.getWidth();
                    }
                    if (b > height) {
                        b = height;
                        t = b - v.getHeight();
                    }

                    v.layout(l, t, r, b);
                    lastX = (int) event.getRawX();
                    lastY = (int) event.getRawY();
                    v.postInvalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    // Log.i("getRawX", (int)event.getRawX()+"");
                    // Log.i("getRawY", (int)event.getRawY()+"");
                    // Log.i("getX", (int)event.getX()+"");
                    // Log.i("getY", (int)event.getY()+"");
                    // Log.i("getWidth", v.getWidth()+"");
                    // Log.i("getHeight", v.getHeight()+"");
                    break;
                }
                return false;
            }
        });           

复制

getX()是表示组件相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕)

如果你的某个Activity中实现OnTouchListener接口,需要重写onTouch(View view,MotionEvent event) 这个方法,getRawX()和getRawY()获得的是相对屏幕的位置,getX()和getY()获得的永远是view的触摸位置坐标(这两个值不会超过view的长度和宽度)。

getX和getRawX

当然,如果重写Activity的onTouchEvent(MotionEvent event) ,这个时候获得的是屏幕点击位置的坐标。event.getX() 与 event.getRawX()获取的值是一样的,event.getY() 与 event.getRawY()获取的值是一样

getX和getRawX

下面简单来讲讲onTouch和onTouchEvent的区别

onTouch:属于某个组件的OnTouchListener接口,点击组件有效

onTouchEvent:属于Activity,点击全屏幕有效

onTouchEvent可以用来实现雷霆战机之类的游戏的飞机移动的效果