【问题标题】:Android: How to drag(move) PopupWindow?Android:如何拖动(移动)PopupWindow?
【发布时间】:2021-08-06 10:30:45
【问题描述】:

我希望能够在触摸拖动时移动 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?

【问题讨论】:

    标签: android drag popupwindow


    【解决方案1】:

    在 Eclipse 中,查看 getX() 上的信息时,它说: getX(int) for the first pointer index 。我假设这应该是为 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;
    

    【讨论】:

      【解决方案2】:

      试试这个:

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

      【讨论】:

        【解决方案3】:

        尝试使用getRawX()getRawY() 而不是getX()getX()。 再次触摸时它仍然会弹起一点,但移动时会更顺畅。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-28
          • 2020-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多