हम अपनी परियोजना में एक मानक एंड्रॉइड एप्लिकेशन से एक घटक का उपयोग करते हैं

Android की ताकत उसके खुलेपन में है। किसी भी पसंदीदा एप्लिकेशन का सोर्स कोड (यदि यह Google Apps में से एक नहीं है) या एक घटक का न केवल अध्ययन किया जा सकता है, बल्कि अपने और उपयोगकर्ताओं की खुशी के लिए आपकी परियोजना को भी खराब कर दिया है। इसके अलावा, इसके डिजाइन और व्यवहार उपयोगकर्ताओं के लिए परिचित और परिचित होंगे। इस लेख में मैं दिखाऊंगा कि यह कैसे करना है। हम उस घटक को चुनेंगे जिसे हम उधार लेना चाहते हैं, इसे स्रोत में ढूंढते हैं, इसका अध्ययन करते हैं, इसे हमारे पुस्तकालय में जोड़ते हैं और इसे हमारे आवेदन से जोड़ते हैं।

छवि


घटक का चयन करें


शुरू करने के लिए - हम चुन सकते हैं कि मानक एंड्रॉइड एप्लिकेशन में से एक में हमारी आँखें कितनी आकर्षित करती हैं। मेरे मामले में, यह घड़ी के अनुप्रयोग में एक गोलाकार टाइमर है। यह इस तरह दिखता है:

छवि

लेकिन मैं इसे केवल टाइमर के रूप में नहीं, बल्कि प्रगति के एक संकेतक के रूप में उपयोग करना चाहता हूं।

स्रोत का पता लगाएं


अगला कदम एंड्रॉइड एप्लिकेशन के स्रोत कोड में कई अन्य लोगों के बीच इस विशेष घटक के स्रोत कोड को ढूंढना है। ये सभी स्रोत http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android-apps/ पर देखे जा सकते हैं

हम नवीनतम संस्करण का चयन करते हैं (इस लेख को लिखने के समय यह 4.2.2_r1 है), "कॉम / एंड्रॉइड" पर जाएं और सही एप्लिकेशन देखें। मेरे मामले में, यह डेस्कलॉक है। हम कक्षाओं की सूची पर नज़र डालते हैं और ... हम भाग्यशाली हैं - एक वर्ग है जिसका नाम CircleTimerView है। हालाँकि, वर्ग विवरण के बजाय - “TODO: यहाँ वर्णन डालें। (isaackatz द्वारा उत्पन्न) »यह वर्ग व्यू को विरासत में मिला है - यह हमारे पुस्तकालय का प्रमुख वर्ग होगा।

एक पुस्तकालय बनाएँ


यदि आप घटक को अनुप्रयोग में जोड़ने का निर्णय लेते हैं तो आप इस अनुच्छेद को छोड़ सकते हैं। उदाहरण के लिए, जैसा कि मेरे मामले में है। लेकिन एक उदाहरण के लिए, हम इसे पुस्तकालय के माध्यम से करेंगे। अपनी पसंदीदा IDE लॉन्च करें, एक नया प्रोजेक्ट बनाएं, "लाइब्रेरी के रूप में मार्क प्रोजेक्ट" चिह्नित करें।

लाइब्रेरी में (या सीधे प्रोजेक्ट के लिए) पाया क्लास कॉपी करें। क्या कक्षा में कई महत्वपूर्ण त्रुटियां हैं? और ठीक ही तो है! हमने केवल कक्षा की नकल की, जो हमारे आवेदन के बीच संपर्क का बिंदु होगा और मानक आवेदन के स्रोतों से हमारे पुस्तकालय में जोड़े गए सभी वर्ग।

हम देखते हैं - इससे पहले कि हम इसे सामान्य निवास स्थान से बाहर खींचते हैं, उस पर हमारी कक्षा क्या निर्भर करती है। मेरे मामले में, ये यूटिल्स, स्टॉपवॉच क्लासेज और आर कॉन्स्टेंट का बॉक्स हैं।

हम यूटिल्स वर्ग की नकल करते हैं और इसमें पहले से ही अन्य वर्गों पर निर्भरता देखते हैं। अब आप या तो अपनी ज़रूरत की सभी कक्षाओं को जोड़ सकते हैं, और फिर सभी वर्गों को जिनकी ज़रूरत है ... लेकिन यह बेहतर है कि उपयोगितावादी वर्ग से केवल उन्हीं तरीकों को छोड़ें जिनकी हमें ज़रूरत है। हम getTimeNow () और calculRadiusOffset () को छोड़कर सब कुछ फेंक देते हैं, अनावश्यक आयातों को हटा देते हैं - ठीक है।

स्टॉपवॉच वर्ग से केवल तीन स्थिरांक का उपयोग किया जाता है और, आगे देखते हुए, मैं कहता हूं कि मुझे उनकी आवश्यकता नहीं है, साथ ही साथ उनका उपयोग करने की विधि भी।

आर बॉक्स से, हम इंडेंटेशन और रंग डेटा लेते हैं, और यहां क्लास को कॉपी करना आसान नहीं है - यह स्वचालित रूप से संसाधनों के आधार पर उत्पन्न होता है। संसाधनों को जोड़ना है। आप उन्हें "पैकेज / एप्लिकेशन" पते पर स्रोत कोड में पा सकते हैं, तैयार किए जाने वाले एप्लिकेशन का चयन करें, "Res / मान" फ़ोल्डर पर जाएं, "color.xml" और "व्यास। xml" फ़ाइलों को हमारे कंप्यूटर लाइब्रेरी के उसी फ़ोल्डर में कॉपी करें।

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

लाइब्रेरी को हमारे एप्लिकेशन से कनेक्ट करें


अब कार्रवाई में काम का परिणाम देखने के लिए सबसे प्यारी चीज है। हम अपने एप्लिकेशन की परियोजना को खोलते हैं, जिसमें इस घटक की आवश्यकता होती है, बनाई गई लाइब्रेरी को कनेक्ट करें, com.android.deskclock.CircleTimerView तत्व मार्कअप पर फेंक दें, और यह तब होता है जब हम आवेदन शुरू करते हैं:

छवि

खैर, यह एक सफेद घेरा है, लगभग जो हम लक्ष्य कर रहे थे। यह केवल इसे कार्रवाई में लाने के लिए बनी हुई है - हमें एक कोड की आवश्यकता है जो हमारे सर्कल को शांत कर देगा।

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

final CircleTimerView circleTimerView1 =
(CircleTimerView) findViewById(R.id.circleTimerView1);


circleTimerView1.setIntervalTime(10000);

circleTimerView1.startIntervalAnimation();

हम फिर से एप्लिकेशन लॉन्च करते हैं और वांछित (कम से कम मेरे द्वारा) परिणाम देखते हैं:

छवि

अब सब कुछ वैसा ही है जैसा होना चाहिए, जिसका अर्थ है कि एंड्रॉइड डेवलपमेंट टीम को धन्यवाद कहने का समय है। यह अपाचे लाइसेंस संस्करण 2.0 लाइसेंस समझौते के पाठ को अपने आवेदन में जोड़ने के बारे में है। उदाहरण के लिए, सेटिंग्स में एक बटन के स्पर्श में इसे प्रदर्शित करें।

अंदर क्या है?


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

मेरे उदाहरण से कक्षा में, सब कुछ सरल है: सभी onDraw (कैनवास कैनवास) विधि, पोस्टइंलिडेट () में redrawing कॉल करने के लिए। सर्कल एनीमेशन के निरंतर होने के लिए, अमान्य () को सीधे onDraw (...) में कहा जाता है।

अद्यतन अब मैंने क्षेत्र में घटक का परीक्षण किया - ऑनड्राव (...) से अमान्य () कॉलिंग के बारे में आशंकाओं की पुष्टि की गई: पुनरावृत्ति और प्रतिपादन द्वारा, घटक तुरंत इस कार्रवाई को दोहराना शुरू करता है और अबाधित जारी है।
प्रतिपादन, बेशक, चिकनी है, लेकिन यह एक 700 मेगाहर्ट्ज प्रोसेसर का उपयोग करता है, फोन जल्दी से ऊर्जा की खपत करता है और यहां तक ​​कि अधिसूचना पर्दे को धीमा कर देता है। और यह, शायद, पहली बार है कि मेरे गैलेक्सी नेक्सस ने काफी गर्मी शुरू कर दी।
इसे ठीक करने के लिए यह काफी सरल है: हमेशा से हमें लगातार टाइमर अपडेट करने की आवश्यकता होती है। यहां आपको यह विचार करने की आवश्यकता है कि परिवर्तन के लिए दृष्टिगोचर होने के लिए कितना समय गुजरना चाहिए। उदाहरण के लिए, हम एक उच्च रिज़ॉल्यूशन वाले टैबलेट पर इस घटक में 5-सेकंड की उलटी गिनती चलाते हैं, फिर यह निरंतर अद्यतन करने के लिए समझ में आता है। या यह कम रिज़ॉल्यूशन वाले फोन पर दो घंटे का टाइमर है। हम प्रति सेकंड कम से कम 10 redraws प्रदर्शन कर सकते हैं, लेकिन नेत्रहीन वे ध्यान देने योग्य नहीं होंगे।

यदि आवश्यक हो, तो आप अपनी आवश्यकताओं के लिए घटक को फिर से लिख सकते हैं (उदाहरण के लिए, प्रगति संकेतक के तहत) या इसे विरासत में लें और आवश्यक विधियों को ओवरराइड करें।

आगे क्या है?


हम भाग्यशाली थे - उदाहरण से घटक ने कुछ भी उपयोग नहीं किया जो कि एपीआई स्तर 7 (एंड्रॉइड 2.1) में नहीं है, अन्यथा इसे इस अप्रिय समस्या को हल करना होगा। इसके बारे में - अगली बार।

आप सभी को धन्यवाद


यदि किसी ने इस लेख को अंत तक पढ़ा, तो अपने पसंदीदा मानक एंड्रॉइड एप्लिकेशन से सुंदर घटक को याद किया और इसे अपनी परियोजना में जोड़ा - मुझे खुशी है कि मेरा काम व्यर्थ नहीं गया।

Source: https://habr.com/ru/post/In183846/


All Articles