2012-11-25 16 views
6

एप्लिकेशन के इंटरफ़ेस में निम्नलिखित आइटम शामिल हैं।छवि स्विचर में चुटकी ज़ूमिंग कैसे सक्षम करें?

  1. एक छवि स्विचर जो पूरी स्क्रीन भरती है।
  2. next बटन।
  3. previous बटन।

मैं कैसे image Switcher में pinch zooming उपयोग कर सकते हैं? सिवाय यह शुरू होता है जब दूसरे उंगली स्क्रीन (ACTION_POINTER_DOWN) को दबाया जाता है

उत्तर

0

पिंच को लागू ज़ूम इशारा

चुटकी ज़ूम इशारा, खींचें इशारा के समान है।

 
case MotionEvent.ACTION_POINTER_DOWN: 
oldDist = spacing(event); 
Log.d(TAG, "oldDist=" + oldDist); 
if (oldDist > 10f) { 
savedMatrix.set(matrix); 
midPoint(mid, event); 
mode = ZOOM; 
Log.d(TAG, "mode=ZOOM"); 
} 
break; 


case MotionEvent.ACTION_MOVE: 
if (mode == DRAG) { 
// ... 
} 
else if (mode == ZOOM) { 
float newDist = spacing(event); 
Log.d(TAG, "newDist=" + newDist); 
if (newDist > 10f) { 
matrix.set(savedMatrix); 
float scale = newDist/oldDist; 
matrix.postScale(scale, scale, mid.x, mid.y); 
} 
} 
break; 

जब हमें दूसरी उंगली के लिए नीचे की घटना मिलती है, तो हम दो अंगुलियों के बीच की दूरी की गणना और याद करते हैं। मेरे परीक्षण में, एंड्रॉइड कभी-कभी मुझे (गलत तरीके से) बताएगा कि लगभग दो ही अंगुलियां लगभग उसी स्थिति में दबाई गई थीं। तो अगर घटना कुछ पिक्सेल की मनमानी संख्या से छोटी है तो मैंने घटना को अनदेखा करने के लिए एक चेक जोड़ा। यदि यह उससे बड़ा है, तो हम वर्तमान परिवर्तन मैट्रिक्स को याद करते हैं, दो अंगुलियों के मध्य बिंदु की गणना करते हैं, और ज़ूम शुरू करते हैं।

जब हम ज़ूम मोड में होते हैं तो एक चाल घटना आती है, हम फिर से उंगलियों के बीच की दूरी की गणना करते हैं। यदि यह बहुत छोटा है, तो ईवेंट को अनदेखा किया जाता है, अन्यथा हम रूपांतरण मैट्रिक्स को पुनर्स्थापित करते हैं और मध्य बिंदु के आसपास छवि को स्केल करते हैं।

स्केल केवल पुरानी दूरी से विभाजित नई दूरी का अनुपात है। यदि नई दूरी बड़ी है (यानी, उंगलियों को और अलग कर दिया गया है), तो स्केल 1 से बड़ा होगा, जिससे छवि बड़ी हो जाएगी। यदि यह छोटा है (अंगुलियों को एकसाथ करीब), तो स्केल छवि से कम होने के बाद एक से कम होगा। और निश्चित रूप से यदि सबकुछ एक जैसा है, तो पैमाने 1 के बराबर है और छवि नहीं बदली गई है।

अब चलिए रिक्ति() और midPoint() विधियों को परिभाषित करते हैं।

दो अंक

के बीच की दूरी संख्या जानने के लिए दूर दो उंगलियों हैं, हम पहले एक सदिश (एक्स, वाई) जो दो अंक के बीच अंतर है निर्माण।

फिर हम रिक्ति की गणना करने के इयूक्लिडियन दूरी के लिए सूत्र का उपयोग करें:

 
private float spacing(MotionEvent event) { 
float x = event.getX(0) - event.getX(1); 
float y = event.getY(0) - event.getY(1); 
return FloatMath.sqrt(x * x + y * y); 
} 

बिंदुओं का अनुक्रम कोई फर्क नहीं पड़ता क्योंकि किसी भी नकारात्मक संकेत जब हम उन्हें वर्ग खो जाएगा। ध्यान दें कि सभी गणित जावा के फ्लोट प्रकार का उपयोग करके किया जाता है। हालांकि कुछ एंड्रॉइड डिवाइसों में फ्लोटिंग पॉइंट हार्डवेयर नहीं हो सकता है, लेकिन हम इसके प्रदर्शन के बारे में चिंता करने के लिए अक्सर ऐसा नहीं कर रहे हैं।

दो अंक

दो अंक के बीच में एक बिंदु गिना जा रहा है के मध्य भी आसान है:

 
private void midPoint(PointF point, MotionEvent event) { 
float x = event.getX(0) + event.getX(1); 
float y = event.getY(0) + event.getY(1); 
point.set(x/2, y/2); 
} 

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

This is an excerpt from Hello, Android 3rd edition, published by the Pragmatic Bookshelf. For more information or to purchase a paperback or PDF copy, please visit http://www.pragprog.com/titles/eband3

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