2013-01-09 37 views
7

मैं एक गोलाकार क्षेत्र को स्पर्श करते समय मीडिया खेलना चाहता हूं, लेकिन मैं यह कैसे निर्धारित कर सकता हूं कि मेरी स्पर्श स्थिति सर्कल में है?एंड्रॉइड: यह निर्धारित करने के लिए कि एक स्पर्श घटना सर्कल में है या नहीं?

अब तक मैं view का विस्तार करता हूं और onTouchEvent लागू करता हूं, और मुझे यह तय करने के लिए एल्गोरिदम की आवश्यकता होती है कि स्थिति सर्कल के अंदर या बाहर है या नहीं।

उत्तर

12

आप View.getX() और View.getY() साथ दृश्य की स्थिति लेना चाहिए x और ऊपरी बाएं कोने की y प्राप्त करने के लिए है और यह भी यह सोचते हैं आप त्रिज्या (या देखने की चौड़ाई/ऊंचाई प्राप्त करने के लिए त्रिज्या निर्धारित करने में सक्षम) पता है। उसके बाद, MotionEvent.getX() और MotionEvent.getY() का उपयोग कर xTouch और yTouch प्राप्त करें और अगर जाँच:

double centerX = x + radius; 
double centerY = y + radius; 
double distanceX = xTouch - centerX; 
double distanceY = yTouch - centerY; 

boolean isInside() { 
    return (distanceX * distanceX) + (distanceY * distanceY) <= radius * radius; 
} 

सूत्र का निर्धारण करता है, तो बिंदु के भीतर वृत्त क्षेत्र है या नहीं के लिए स्कूलों ज्यामिति की सिर्फ व्याख्या है। अधिक जानकारी के लिए circle equation for Cartesian coordinates देखें।

मान विवरण है:

(x + radius) और (y + radius) चक्र के केंद्र है।

(xTouch - (x + radius)) एक और तरीका है यह करने के लिए वाई

+0

आपको बहुत बहुत धन्यवाद, मेरी मदद करो एक बहुत – Camus

+0

है किसी को भी इस तर्क को समझाने के लिए कृपया सक्षम? यह बहुत अच्छा काम करता है, लॉजिक –

+1

@ जोमेमर के कुछ स्पष्टीकरण के साथ बस बेहतर होगा, ज्यामिति स्पष्टीकरण के बारे में कुछ और विवरण जोड़े – sandrstar

2

द्वारा एक्स द्वारा केंद्र के लिए स्पर्श बिंदु से दूरी

(yTouch - (y + radius)) केंद्र के लिए स्पर्श बिंदु से दूरी है, और एक छोटे से सरल मुझे लगता है, उपयोग करने के लिए है दो बिंदु सूत्र के बीच की दूरी और उस त्रिज्या से उस दूरी की तुलना करें। यदि गणना की दूरी त्रिज्या से कम है तो स्पर्श आपके सर्कल के अंदर है।

यहाँ कोड

// Distance between two points formula 
float touchRadius = (float) Math.sqrt(Math.pow(touchX - mViewCenterPoint.x, 2) + Math.pow(touchY - mViewCenterPoint.y, 2)); 

if (touchRadius < mCircleRadius) 
{ 
    // TOUCH INSIDE THE CIRCLE! 
}