खैर, यह आप पहले से ही पता चला है दो मतभेद हैं क्यों लगता है क्योंकि वे विभिन्न घनत्व पैमाने कारकों की रिपोर्ट में यह बताया गया है:
- नेक्सस 7: tvdpi: स्केल फैक्टर = 1.333
- Kindle Fire HD: एचडीपीआई: स्केल फैक्टर = 1.5
तो तकनीकी रूप से वही भौतिक आकार और संकल्प होने पर वे अलग-अलग रिपोर्ट क्यों करते हैं?
कोर समस्या वास्तव में मौजूद है क्योंकि एक डिवाइस Google Play डिवाइस (नेक्सस) है और दूसरा (जलरोधक) नहीं है। सभी एंड्रॉइड डिवाइस जिनमें Google Play (और अन्य Google ऐप्स) हैं, केवल संगतता परीक्षण सूट (सीटीएस) नामक कुछ गुजरकर ऐसा कर सकते हैं, जो यह सत्यापित करता है कि इस तरह की सेटिंग्स उनके मानकों के अनुरूप होती हैं। मानकों को प्रत्येक रिलीज के लिए एक संगतता परिभाषा दस्तावेज़ (सीडीडी) में दस्तावेज किया जाता है। Here is a link to the CDD for Android 4.0 (धारा 7.1 स्क्रीन आकार और घनत्व से संबंधित है)। सीडीडी एक डिवाइस निर्माता को बताता है कि उन्हें स्केल फैक्टर की रिपोर्ट करनी चाहिए जो कि स्क्रीन के वास्तविक डीपीआई के करीब है, जो वास्तव में इस मामले में टीवीडीपीआई है।
अमेज़न उपकरणों किसी भी Google ऐप्लिकेशन का उपयोग नहीं करते हैं, Google Play भी शामिल है। हालांकि यह समान मानकों का पालन करने के लिए उनके सर्वोत्तम हित में हो सकता है, लेकिन वे उनके द्वारा बाध्य नहीं हैं, और अक्सर इसका पालन नहीं किया जाता है। नेक्सस 7 पर दिखाए जाने पर टीवीडीपीआई हर किसी पर फंस गया, लेकिन अगर अमेज़ॅन डिजाइन के दौरान सीडीडी का संदर्भ देता है तो अमेज़ॅन इसके बारे में जान लेगा।
यह कैसे उन्हें अलग तरीके से व्यवहार करने के लिए पैदा होता है?
मतभेद अपने लेआउट चयन में नहीं हैं। स्पष्ट रूप से आपके स्क्रीनशॉट से दोनों डिवाइस उचित लेआउट उठा रहे हैं जैसा कि आप उन्हें उम्मीद करते हैं। लेआउट निर्देशिका पर sw
मान को बदलना केवल यह दर्शाता है कि कौन से डिवाइस उस लेआउट का चयन करेंगे ... यह कुछ भी नहीं बदलेगा कि चीजें कैसे स्केल होंगी। घनत्व विशिष्ट निर्देशिकाओं में खुद को लेआउट रखने की कोशिश न करें ... लेआउट लचीला होना चाहिए।
इसके बजाय समस्या घनत्व-स्वतंत्र पिक्सेल इकाइयों (यानी डुबकी या डीपी) पर किए गए किसी भी आयाम या आकार की गणना के साथ निहित है, जैसे पाठ आकार, आपके द्वारा बनाए गए किसी भी निश्चित दृश्य आकार और खींचने योग्य आकार।
क्योंकि इन दो उपकरणों चुना अलग ढंग से संपत्ति पैमाने पर करने के लिए, आप का उपयोग किसी भी drawable संसाधन या किसी भी मूल्य आप "डी पी" में परिभाषित है एक छोटा सा परिवर्तन का परिणाम देगा।मुझे आपको दो उदाहरण दें:
आप TextView
के लिए टेक्स्ट आकार को 16dp
के लिए परिभाषित करते हैं। नेक्सस 7 पर, यह पाठ 21px पर खींचा जाएगा। किंडल फायर एचडी उसी पाठ को 24 पीएक्स पर आकर्षित करेगा। अंतर छोटा है ... लेकिन यह अस्तित्व में है।
समान चित्रों के लिए भी यही सच है। यदि आपने केवल 481248 पर drawable-mdpi
में एक छवि को परिभाषित किया है और उसी छवि को drawable-hdpi
में 72x72 पर परिभाषित किया गया है, तो किंडल में सीधे उपयोग करने के लिए 72px छवि है, और नेक्सस 64px छवि स्केल करेगा, इसलिए दो संपत्तियों के बीच 8 पिक्सेल का अंतर है ।
दो और समान दिखने के लिए मैं क्या कर सकता हूं?
ज्यादातर मामलों में, मैं कहूंगा कि आपको नहीं करना चाहिए। आम तौर पर स्केलिंग पूरी तरह से आवेदन के नतीजे को प्रभावित नहीं करती है जब तक कि लेआउट की बाधाएं बहुत अधिक हार्ड-कोडित आकारों के साथ स्थापित न हों।
हालांकि, सामान्य रूप से यदि आपके यूआई के कुछ हिस्सों हैं जिन्हें आपको विशेष रूप से इस उद्देश्य के लिए बदलने की आवश्यकता है, तो समाधान -tvdpi
मामले के लिए विशिष्ट संसाधनों और आयामों को परिभाषित करना है जहां आपको लगता है कि वे आवश्यक हैं (फिर से, मैं नहीं ' इस मामले को पूरा करने के लिए अपने ऐप में सबकुछ स्केल करने की अनुशंसा नहीं करते हैं)।
टेक्स्ट या दृश्य आकार जैसी चीज़ों के लिए, इसका मतलब है कि आप values-tvdpi/dimensions.xml
फ़ाइल और डिफ़ॉल्ट values/dimensions.xml
फ़ाइल चाह सकते हैं। ऊपर दिए गए उदाहरण का उपयोग करके, आप डिफ़ॉल्ट टेक्स्ट आकार को 16 डीपी के रूप में परिभाषित कर सकते हैं, लेकिन -tvdpi
स्थान पर, उसी आयाम को 18 डीपी के रूप में परिभाषित करें। इससे दोनों डिवाइस अंतिम पाठ को 24px तक स्केल कर देंगे। आपके कोड में, जहां वास्तविक आयाम का उपयोग किया जाता है, इसे सीधे 16dp
के बजाय @dimen/myTextSize
के रूप में संदर्भित करें।
drawable आइटम के लिए, एक drawable-tvdpi
निर्देशिका जोड़ सकते हैं और मैच के लिए आप कैसे लगता है कि वे Nexus 7 की तरह एक बार फिर हमारे पिछले उदाहरण के साथ, उपकरणों पर आकर्षित करना चाहिए drawable-tvdpi
फ़ोल्डर में drawable-hdpi
फ़ोल्डर से एक ही छवि फ़ाइल की प्रतिलिपि उन परिसंपत्तियों पैमाने इसलिए दोनों डिवाइस 72px पर एक ही छवि खींचेंगे।
एकाधिक स्थानों में एक ही संपत्ति की प्रतिलिपि बनाने से बचने के लिए, आप इसे एलियासिंग के साथ भी कर सकते हैं। एक विशेष नाम के साथ छवि को drawable/
में डालकर, और दो स्थानों में एकल संपत्ति का संदर्भ देने के लिए values-tvdpi/drawables.xml
और values-hdpi/drawables.xml
का उपयोग करना। एलियासिंग पर अधिक जानकारी के लिए, see this documentation। उदाहरण लेआउट के लिए हैं, लेकिन type="drawable"
पर बदलकर समान प्रतिमान ड्रॉबल्स (या किसी भी संसाधन) के लिए काम करता है।
दिलचस्प, क्या आप हमें एसएस के साथ आपूर्ति कर सकते हैं जो मतभेद दिखाता है (मुझे पता है कि आप इस परियोजना पर विकास कर रहे हैं क्योंकि यह मुश्किल हो सकता है)? – Warpzit
क्या Nexus7 ऐप को आपके डिफ़ॉल्ट लेआउट के रूप में दिखा रहा है? [एड बर्नेट] (https://plus.google.com/106300001086744879268/posts/Wa9xtQjZHJx) ने टीवीडीपीआई संकल्पों और विशेष रूप से नेक्सस 7 के संबंध में एक मुद्दे के बारे में बात की। मुझे लगता है कि नेक्सस को इसके बजाय डिफ़ॉल्ट लेआउट मिल रहा है। – Korcholis
हमें आपकी मदद करने के लिए बिल्कुल "क्या दिखता है" जानने की आवश्यकता होगी। –