2011-12-16 15 views
14

मुझे स्क्रीन पर कुछ दृश्य खींचना है। मैं टच श्रोता से ACTION_MOVE पर गति ईवेंट से अपने लेआउट पैरामीटर के बाएं और शीर्ष को बदलकर अपनी स्थिति संशोधित कर रहा हूं। क्या वस्तुओं को "चिकनी" खींचने का कोई तरीका है? क्योंकि "खींच" की Tis तरह सभी में कोई चिकनी है ... यहाँ कोडएंड्रॉइड ड्रैग व्यू चिकनी

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(); 
      RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams(); 
      int left = lp.leftMargin + (x - dx); 
      int top = lp.topMargin + (y - dy); 
      lp.leftMargin = left; 
      lp.topMargin = top; 
      view.setLayoutParams(lp); 
      break; 
    } 
    return true; 
} 
+1

कोशिश यहाँ मेरी कोड का उपयोग: http://stackoverflow.com/a/18806475/878126 मुझे लगता है कि यह काफी चिकनी है। –

+0

[एंड्रॉइड ड्रैगगेबल व्यू] (http://www.singhajit.com/android-draggable-view/) –

+0

मैं बस यूट्यूब पर एक वीडियो ट्यूटोरियल अपलोड करता हूं कि किसी भी दृश्य को केवल एक साधारण सहायक वर्ग के साथ खींचने योग्य कैसे बनाया जाए। इसे जांचें: https://youtu.be/licui_5_iLk –

उत्तर

0

यह देखने के लिए कि कैसे आप अपने ACTION_MOVE घटनाओं कार्रवाई कर रहे हैं उपयोगी होगा है। क्या आप event.getHistorical() विधि का उपयोग कर सभी बिंदुओं का उपयोग कर रहे हैं? यदि यह आपको एक आसान ड्रैग नहीं देता है, तो अन्य विचार पथ पर बिंदुओं को अलग करना हो सकता है। मेरा मानना ​​है कि आंदोलन की सुचारुता और उपयोगकर्ता के स्पर्श के त्वरित प्रतिक्रिया प्राप्त करने के बीच एक व्यापार-बंद होगा। HTH।

+0

कृपया संलग्न कोड देखें –

+0

क्या आप स्क्रॉलव्यू के अंदर ड्रैगिंग का उपयोग कर रहे हैं? @gabi – MGDroid

1

गैर-चिकनी चाल का कारण बाएं मार्जिन और शीर्ष मार्जिन का पूर्णांक मान है।
चिकनी चाल की स्थिति के लिए फ्लोट होना चाहिए।
This मदद कर सकता है।

+2

लेआउटपैम्स को वहां इंक की आवश्यकता है। –

21

कोशिश Gety और getX

के बजाय motionEvent.getRawX() और motionEvent.getRawY (उपयोग करने के लिए)
+0

आपने मुझे बचाया, धन्यवाद। –

0

तुम भी मार्जिन का उपयोग कर बहुत चिकनी होने के लिए नहीं जा रहा है अपने ints दौर चाहिए,, एक अलग लेआउट का उपयोग और सेट एक्स और वाई स्क्रीन आयामों के अनुसार निर्देशांक।

2

आपको खींचने के लिए लेआउट पैरामीटर का उपयोग करने की आवश्यकता नहीं है। आप दृश्य के एक्स और वाई निर्देशांक सेट करके इसे कर सकते हैं। आप इस here पर और अधिक पढ़ सकते हैं।

आप ऐसा कुछ कर सकते हैं।

@Override 
    public boolean onTouch(View view, MotionEvent event) { 
    switch (event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
     dX = view.getX() - event.getRawX(); 
     dY = view.getY() - event.getRawY(); 
     break; 

     case MotionEvent.ACTION_MOVE: 
     view.setY(event.getRawY() + dY); 
     view.setX(event.getRawX() + dX); 
     break; 

     default: 
     return false; 
    } 
    return true; 
    } 
+0

भयानक वीडियो अच्छी नौकरी –

+0

लेकिन हमें डेल्टा क्यों जोड़ना चाहिए, उस स्थान के बिना नई पॉइंटर स्थिति में जाने के लिए विचार नहीं है। –

संबंधित मुद्दे