6

कूद रहे हैं मैंने दृश्यों को खींचने के लिए ऑन टचलिस्टर बनाया है। यदि मैं getRawX() और getRawY() का उपयोग करता हूं तो छवियां आसानी से खींचती हैं। इसके साथ समस्या यह है कि जब आप दूसरा पॉइंटर नीचे डालते हैं तो पहला पॉइंटर उठाकर छवि दूसरी पॉइंटर पर पहुंच जाएगी।कूदते छवि देखें। getX() और getY() मान

यह ऑन टचलिस्टर pointerId का ट्रैक रखकर उस समस्या को ठीक करने का प्रयास करता है। इस टचलिस्टनर के साथ समस्या एक छवि दृश्य खींचते समय है, ImageView सुंदर पागलपन के चारों ओर कूदता है। getX() और getY() मूल्य चारों ओर कूदते हैं।

मुझे लगता है कि मैं इसे सही तरीके से कर रहा हूं। मैं इसके लिए एक कस्टम व्यू लिखना नहीं चाहता क्योंकि मैंने पहले ही एक स्केल जेस्चर डिटेक्टर लागू किया है और एक कस्टम रोटेट जेस्चर डिटेक्टर लिखा है जो काम करता है। सब ठीक काम करता है लेकिन getRawX() और getRawY() का उपयोग करते समय मुझे मिलने वाली समस्या को ठीक करने की आवश्यकता है।

किसी को भी मैं गलत यहाँ क्या कर रहा हूँ पता है?

final View.OnTouchListener onTouchListener = new View.OnTouchListener() 
{ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     relativeLayoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); 

     final int action = event.getAction(); 
     switch (action & MotionEvent.ACTION_MASK) 
     { 
      case MotionEvent.ACTION_DOWN: 
      { 
       final float x = event.getX(); 
       final float y = event.getY(); 

       // Where the user started the drag 
       lastX = x; 
       lastY = y; 
       activePointerId = event.getPointerId(0); 
       break; 
      } 
      case MotionEvent.ACTION_MOVE: 
      { 
       // Where the user's finger is during the drag 
       final int pointerIndex = event.findPointerIndex(activePointerId); 
       final float x = event.getX(pointerIndex); 
       final float y = event.getY(pointerIndex); 

       // Calculate change in x and change in y 
       final float dx = x - lastX; 
       final float dy = y - lastY; 

       // Update the margins to move the view 
       relativeLayoutParams.leftMargin += dx; 
       relativeLayoutParams.topMargin += dy; 
       v.setLayoutParams(relativeLayoutParams); 

       // Save where the user's finger was for the next ACTION_MOVE 
       lastX = x; 
       lastY = y; 

       v.invalidate(); 
       break; 
      } 
      case MotionEvent.ACTION_UP: 
      { 
       activePointerId = INVALID_POINTER_ID; 
       break; 
      } 
      case MotionEvent.ACTION_CANCEL: 
      { 
       activePointerId = INVALID_POINTER_ID; 
       break; 
      } 
      case MotionEvent.ACTION_POINTER_UP: 
      { 
       // Extract the index of the pointer that left the touch sensor 
       final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
       final int pointerId = event.getPointerId(pointerIndex); 

       if(pointerId == activePointerId) 
       { 
        // This was our active pointer going up. Choose a new 
        // active pointer and adjust accordingly 
        final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
        lastX = (int) event.getX(newPointerIndex); 
        lastY = (int) event.getY(newPointerIndex); 
        activePointerId = event.getPointerId(newPointerIndex); 
       } 
       break; 
      } 
     } 
     return true; 
    } 
}; 
image1.setOnTouchListener(onTouchListener); 
+0

किसी के पास इसका समाधान है? ऐसा लगता है कि दूसरों ने इस मुद्दे में भाग लिया है, लेकिन मुझे अभी तक कोई समाधान नहीं मिला है। –

उत्तर

10

यह मुद्दा सरल था, लेकिन अप्रत्याशित था। getRawX/Y() पूर्ण निर्देशांक देता है, जबकि getX/Y() दृश्य के सापेक्ष निर्देशांक देता है। मैं दृश्य को स्थानांतरित कर दूंगा, lastX/Y रीसेट कर दूंगा, और छवि अब एक ही स्थान पर नहीं होगी, इसलिए जब मुझे नए मान मिलेंगे तो वे बंद हो जाएंगे। इस मामले में मुझे केवल तभी आवश्यकता थी जहां मैं मूल रूप से छवि दबाया (मामला 'getRawX/Y' का उपयोग करते समय नहीं)।

तो, समाधान बस निम्नलिखित दूर करने के लिए किया गया था:

// Save where the user's finger was for the next ACTION_MOVE 
lastX = x; 
lastY = y; 

मैं, आशा है कि यह भविष्य में किसी को मदद मिलेगी, क्योंकि मैं इस समस्या के साथ अन्य लोगों को देखा है, और वे मेरे लिए इसी तरह कोड था (रीसेटिंग lastX/Y)

+0

खुशी मुझे यह मिला! मुझे संदेह है कि http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html पढ़ने के कारण कई लोगों को अंतिमX/LastY को सहेजने के लिए कोड है। स्पष्ट रूप से एक दृश्य को स्थानांतरित करने की स्थिति "मल्टीटाउच" में उदाहरण से भिन्न होती है जहां एक कैनवास का अनुवाद किया जा रहा है। आखिरी टिप्पणी, http://stackoverflow.com/questions/16676097/android-getx-gety-interleaves-relative-absolute-coordinates?rq=1, नोट करता है कि जब उसने view.setX() की सेटिंग पर टिप्पणी की और view.setY(), ऑन टच() के दौरान पूर्ण और सापेक्ष निर्देशांक का अंतःकरण रोक दिया गया। –

+0

@ टी। फोल्सम ग्लेड मैं मदद कर सकता था! हां, बहुत से लोग आपके पहले लिंक के बाद अपना कोड मॉडल करते हैं, स्वयं शामिल है। जहां तक ​​मुझे पता है, 'getX() 'और' getY() 'हमेशा सापेक्ष निर्देशांक लौटाते हैं। उनके निर्देशांक मेरे जैसे ही कारण से कूद रहे थे। वह दृश्य को आगे बढ़ाता है और फिर अलग-अलग रिश्तेदार निर्देशांक प्राप्त करता है क्योंकि दृश्य बदल गया है। क्या इसका कोई मतलब है? –

+0

हां, इससे अधिक लोगों की मदद मिली :) – Nate

0

मैं एक टिप & लगता है कि यह मदद मिलेगी है:

यहाँ मेरी onTouchListener है।

invalidate() : does only redrawing a view,doesn't change view size/position. 

आप क्या इस्तेमाल करना चाहिए requestLayout() है: मापने और लेआउट प्रक्रिया करता है। & मुझे लगता है कि requestLayout() कॉल किया जाएगा जब setLayoutParams() पर कॉल करें;

तो v.invalidate()

निकाल कर प्रयास करें या बजाय view.layout(left,top,right,bottom) पद्धति का उपयोग करके layoutParams सेट करके देखें।

+0

मैंने अतीत में 'v.invalidate()' को हटाने का प्रयास किया है (आपने इसे अभी सुझाए जाने के बाद फिर से कोशिश की है) क्योंकि मुझे लगता है कि यह इस परिदृश्य में बेकार है, हालांकि मदद नहीं करता है। मैंने इसे 'v.requestLayout()' के साथ बदलने की कोशिश की और इससे व्यवहार में कोई बदलाव नहीं आया:/कोई अन्य सुझाव? –

+0

'forceLayout()' या तो –

+0

के साथ कोई पासा या लेआउट पैराम सेट करने के बजाय view.layout (बाएं, ऊपर, दाएं, नीचे) विधि का उपयोग करने का प्रयास करें। – vakman

0

बहुत सारे शोध के बाद, मुझे यह मुद्दा माना गया, getRawX पूर्ण है और getX देखने के सापेक्ष है। इसलिए इसका उपयोग एक से दूसरे

//RawX = getX + View.getX 

event.getRawX == event.getX(event.findPointerIndex(ptrID1))+view.getX() 
संबंधित मुद्दे