天天看點

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可以用來實作雷霆戰機之類的遊戲的飛機移動的效果