2012-01-27 17 views
5

Quiero ser capaz de mover PopupWindow en el toque de arrastre. No deseo que la interfaz de usuario se actualice con el lanzamiento del toque. Quiero que PopupWindow siga mi toque.Android: ¿Cómo arrastrar (mover) PopupWindow?

Esto es algo de lo que estoy haciendo:

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

Lo que sucede es, como me arrastre la ventana emergente, que parpadea ida y vuelta en la ubicación original y donde mi dedo es.

parpadeo Logcat Resultado:

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 

Pero si quito (comentar) "mPopupWindow.update (izquierda, arriba, -1, -1);", devuelve resultado correcto. (Pero, obviamente, la interfaz de usuario no actualizar):

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 

¿cómo iba a mover un PopupWindow correctamente?

Respuesta

4

En eclipse, cuando se mira la información en getX(), dice: getX (int) para el primer índice de puntero. Estoy asumiendo que este debería ser el único usado al establecer la primera xey para ACTION.DOWN. Al usar ACTION.MOVE, getRawX() y getRawY(), eclipse dice: ubicación original del evento en la pantalla. Utilizándolo de esta manera, la ventana emergente no parpadeará y permanecerá en su ubicación después de moverse hasta que se cierre.

código Actualizado:

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

Pruebe getRawX() y getRawY() en lugar de getX() y getX(). Todavía rebota un poco cuando lo toca de nuevo, pero es mucho más suave cuando se mueve. Si tiene una mejor solución, infórmenos.

2

Prueba esto:

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