Android:如何拖动(移动)PopupWindow?

时间:2012-01-27 15:26:06

标签: android drag popupwindow

我希望能够在触摸拖动时移动PopupWindow。 我不希望UI在触摸发布时更新。我希望PopupWindow跟随我的触摸。

这就是我正在做的事情:

mView = mLayoutInflater.inflate(R.layout.popup,
                null);
mPopupWindow = new PopupWindow(mView,
               LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, false);
mPopupWindow.showAtLocation(parentView, Gravity.CENTER, -5, 30);

mView.setOnTouchListener(new OnTouchListener() {
        private int dx = 0;
        private int dy = 0;

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    dx = (int) motionEvent.getX();
                    dy = (int) motionEvent.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    int x = (int) motionEvent.getX();
                    int y = (int) motionEvent.getY();
                    int left =  (x - dx);
                    int top =   (y - dy);
                    Log.d("test", "x: " + left + " y: " + top);
                    mPopupWindow.update(left, top, -1, -1);
                    break;
            }
            return true;
        }
    });

当我拖动弹出窗口时,它会在原始位置和我手指所在的位置来回闪烁。

闪烁的Logcat结果:

x: -44 y: 4
x: -43 y: 37
x: -46 y: 4
x: -46 y: 38
x: -48 y: 4
x: -47 y: 38
x: -50 y: 4

但是如果我删除(注释掉)“mPopupWindow.update(left,top,-1,-1);”,它会返回正确的结果。 (但显然UI不会更新):

x: -33 y: 0
x: -37 y: 0
x: -41 y: 0
x: -43 y: 3
x: -46 y: 3
x: -50 y: 3
x: -54 y: 4
x: -57 y: 4

如何正确移动PopupWindow?

3 个答案:

答案 0 :(得分:4)

在eclipse中,当查看getX()上的信息时,它会说:第一个指针索引的getX(int)。我假设这应该是为ACTION.DOWN设置第一个x和y时唯一使用的。当使用ACTION.MOVE,getRawX()和getRawY()时,eclipse说:屏幕上事件的原始位置。通过这种方式使用它,弹出窗口不会闪烁,并且在移动后将保持在其位置,直到它被解除。

更新的代码:

case MotionEvent.ACTION_DOWN:
    dx = (int) event.getX();
    dy = (int) event.getY();
    break;

case MotionEvent.ACTION_MOVE:
    xp = (int) event.getRawX();
    yp = (int) event.getRawY();
    sides = (xp - dx);
    topBot = (yp - dy);
    popup.update(sides, topBot, -1, -1, true);
    break;

答案 1 :(得分:3)

试试这个:

mView = mLayoutInflater.inflate(R.layout.popup,
                null);
mPopupWindow = new PopupWindow(mView,
               LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, false);
mPopupWindow.showAtLocation(parentView, Gravity.CENTER, mPosX, mPosY);

mView.setOnTouchListener(new OnTouchListener() {
        private int dx = 0;
        private int dy = 0;

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    dx = mPosX - motionEvent.getRawX();
                    dy = mPosY - motionEvent.getRawY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    mPosX = (int) (motionEvent.getRawX() + dx);
                    mPosY = (int) (motionEvent.getRawY() + dy);
                    pop.update(mPosX, mPosY, -1, -1);
                    break;
            }
            return true;
        }
    });

答案 2 :(得分:1)

尝试getRawX()和getRawY()而不是getX()和getX()。 当你再次触摸它时它仍然反弹一点,但移动时它会更平滑。 如果您有更好的解决方案,请告诉我们。