2012-01-27 19 views
5

मैं पॉपअपविंडो को स्पर्श खींचने पर स्थानांतरित करने में सक्षम होना चाहता हूं। मैं नहीं चाहता कि यूआई स्पर्श के रिलीज पर अपडेट हो। मैं पॉपअपविंडो को अपने स्पर्श का पालन करना चाहता हूं।एंड्रॉइड: कैसे पॉपअप विन्डो खींचें (स्थानांतरित करें)?

यह कुछ मैं क्या कर रहा हूँ है:

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

क्या होता है, जैसा कि मैं पॉप अप विंडो खींचें, इसे आगे और पीछे मूल स्थान और जहां मेरी उंगली है पर flickers।

चंचल 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),", यह सही परिणाम देता है। (लेकिन स्पष्ट रूप से यूआई अपडेट नहीं होगा):

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 सही ढंग से कदम होगा?

उत्तर

4

ग्रहण में, getX() पर जानकारी को देखते समय, यह कहता है: पहले सूचक सूचकांक के लिए getX (int)। मुझे लगता है कि ACTION.DOWN के लिए पहला x और y सेट करते समय यह केवल तभी उपयोग किया जाना चाहिए। ACTION.MOVE का उपयोग करते समय, getRawX() और getRawY(), ग्रहण कहता है: स्क्रीन पर ईवेंट का मूल स्थान। इस तरह इसका उपयोग करके, पॉपअप विंडो फ्लिकर नहीं होगी और इसे खारिज होने तक आगे बढ़ने के बाद इसके स्थान पर रहेगी।

अपडेट किया गया कोड:

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; 
     } 
    }); 
संबंधित मुद्दे