2012-01-27 84 views
5

タッチドラッグ時にPopupWindowを動かしたいと思っています。 タッチのリリース時にUIを更新したくありません。私はPopupWindowが私のタッチに従ってほしい。Android:ドラッグ(移動)する方法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(左、上、-1、-1);"、それは正しい結果を返します。 (しかし、明らかにUIが更新されません):私が正しくPopupWindowを移動する方法

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 

答えて

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

getX()およびgetX()の代わりにgetRawX()およびgetRawY()を試してください。 もう一度触れると少しでも跳ね返りますが、移動するとはるかにスムーズです。 より良い解決策がある場合は、私たちにご連絡ください。

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; 
     } 
    }); 
関連する問題