2010-12-28 22 views
9

मेरे पास एंड्रॉइड में ओपनजीएल ईएस व्यू है जो अनुवाद के लिए मैट्रिक्स द्वारा नियंत्रित है। मैं Google मानचित्र ऐप या आईफोन में दिखाई देने वाली गति स्क्रॉलिंग का संकेत पाने का एक तरीका जानने का प्रयास कर रहा हूं। धन्यवाद।चिकनी स्क्रॉल/जड़ें स्क्रॉलिंग/गति स्क्रॉल

उत्तर

11

आपकी समस्या को 2 डी में है, तो यह काफी सरल है

  1. आप
  2. आपका onTouch प्रत्येक फ्रेम में बीता हुआ समय प्राप्त करने की आवश्यकता समारोह आपकी उंगली के त्वरण को मिलेगा। मैं एक दूरी से त्वरण कैसे प्राप्त करें इस पर फार्मूला भूल गया। यह एक समय चर के साथ स्थिति का दूसरा व्युत्पन्न होना चाहिए। लेकिन आपको हमेशा अपने डेल्टाएक्स, डेल्टा को त्वरण में परिवर्तित करना चाहिए। इसे आसान बनाने के लिए आपको वास्तव में कुछ सटीक रखने की ज़रूरत नहीं है। संपादित करें: मैं नहीं जानता कि क्यों मैं इसे नहीं देखा है, लेकिन समारोह सब वहाँ था ...

    acceleration.x = 2 (newposition.x - position.x - speed.x * elapsedTime)/(elapsedTime * बीता हुआ समय);

  3. एक बार जब आप अपना त्वरण कर लेंगे तो आप उस कोड के साथ अपनी नई स्थिति निर्धारित कर सकते हैं। यह 2 डी में सरल भौतिक गतिशीलता है। आपके त्वरण के साथ आप अपनी गति पा सकते हैं और अपनी गति से आप अपनी अगली स्थिति पा सकते हैं।

    speed.x = (float) (mass * acceleration.x * elapsed + speed.x); 
    speed.y = (float) (mass * acceleration.y * elapsed + speed.y); 
    
    
    position.x += mass * acceleration.x/2 * elapsed * elapsed + speed.x * elapsed; 
    position.y += mass * acceleration.y/2 * elapsed * elapsed + speed.y * elapsed; 
    
    
    speed.x *= friction; 
    speed.y *= friction; 
    

मास और घर्षण आप बताएं कि वह कितनी तेजी से चला जाता है और कितनी तेजी से यह अपने आप में धीमी हो जाएगी करने देगा। आपको शायद कोड को ट्विक करना होगा क्योंकि यदि आपको धीमा करने के लिए पीछे स्क्रॉल करना है तो यह गतिशील बिल्कुल ठीक नहीं है।

प्रत्येक फ्रेम के अंत में, आपको अपना त्वरण (0,0) पर रीसेट करना होगा। और स्पर्श के बाद भी प्रत्येक नए फ्रेम पर, त्वरण कुछ पर सेट किया जाना चाहिए। यह बहुत अच्छी तरह से काम करना चाहिए :)

+1

आपके उत्तर को देख रहा था और मुझे आश्चर्य है कि आप त्वरण में उपयोग के लिए गति कैसे प्राप्त करते हैं जब आपकी गति सूत्र को एक्सेलेरियटॉइन की आवश्यकता होती है ... एक निर्भर करता है और दूसरे की आवश्यकता होती है? – Dan

+0

सीधे गति की गणना करने के बजाय, यह त्वरण का उपयोग करने के लिए बेहतर परिणाम दे सकता है। प्रारंभिक गति और त्वरण 0 है। इसलिए आपको इसे निम्न फ्रेम में जोड़ने के लिए कहीं कहीं गति को बचाना होगा। त्वरण प्रत्येक फ्रेम के बीच परिवर्तन से कुछ और नहीं है। त्वरण डेल्टाएक्स, डेल्टाई हो सकता है। वास्तविक गति यह होगी कि डेल्टाएक्स * elapsedTime + lastSpeed। इस तरह, गति को सही ढंग से गणना की जाती है भले ही फ्रेम में बहुत समय लगता है या थोड़ी सी मात्रा होती है। अन्य पैरामीटर जड़ और घर्षण जोड़ने के लिए शारीरिक रूप से थोड़ा सा नकली है। आप वास्तव में इसे हमेशा के लिए स्क्रॉल करना नहीं चाहते हैं। –

1
  1. उस गति को मापें जिस पर दृश्य स्क्रॉल हो रहा है।
  2. पता लगाएँ कि उपयोगकर्ता स्क्रॉलिंग कब रोकता है।
  3. स्क्रॉल दृश्य स्क्रॉल करने की गति को धीरे-धीरे कम करें।

कुछ इस तरह:

public void redraw() { 
    myScrollView.ySpeed = myScrollView.lastY-myScrollView.y; 
    myScrollView.xSpeed = myScrollView.lastX-myScrollView.x; 
    if (!userIsScrolling && ySpeed > 0) { 
     ySpeed--; 
    } 
    if (!userIsScrolling && xSpeed > 0) { 
     xSpeed--; 
    } 
    myScrollView.lastY = myScrollView.y; 
    myScrollView.y += ySpeed; 
    myScrollView.lastX = myScrollView.x; 
    myScrollView.x += xSpeed; 
} 

public void userStoppedScrolling() { 
    userIsScrolling = false; 
} 
+0

धन्यवाद, क्या आप जानते हैं कि मैं उस गति को कैसे नियंत्रित कर सकता हूं जिस पर उपयोगकर्ता स्क्रॉल कर रहा है? अभी यह केवल उपयोगकर्ताओं की उंगली की शुरुआती स्थिति और अंत स्थिति के बीच डेल्टा की गणना करता है और फिर इसे मैट्रिक्स में रखता है। – jfisk

+0

क्षमा करें, मैं एंड्रॉइड को स्पर्श स्थान और ऐसे जैसे विशिष्टताओं के साथ मदद करने के लिए पर्याप्त रूप से नहीं जानता। – Jumhyn

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