2012-10-31 21 views
15

सोचें मैं टैबलेट 7 इंच किंडल फायर एचडी और नेक्सस 7 के लिए एक एप्लीकेशन विकसित कर रहा हूं। ये दो अनुप्रयोग एक ही आकार और एक ही स्क्रीन रिज़ॉल्यूशन हैं। हालांकि, मैं अपना आवेदन चलाता हूं, यह बहुत अलग है। क्यूं कर?नेक्सस 7 और किंडल फायर एचडी, विभिन्न

ऐसा लगता है इस वजह से नेक्सस 7 tvdpi के रूप में पाया जाता है, और Kindle Fire HD HDPI है। मॉडल 1280 * 800 के आधार पर एक ही प्रतिपादन कैसे करें?

धन्यवाद

+0

दिलचस्प, क्या आप हमें एसएस के साथ आपूर्ति कर सकते हैं जो मतभेद दिखाता है (मुझे पता है कि आप इस परियोजना पर विकास कर रहे हैं क्योंकि यह मुश्किल हो सकता है)? – Warpzit

+0

क्या Nexus7 ऐप को आपके डिफ़ॉल्ट लेआउट के रूप में दिखा रहा है? [एड बर्नेट] (https://plus.google.com/106300001086744879268/posts/Wa9xtQjZHJx) ने टीवीडीपीआई संकल्पों और विशेष रूप से नेक्सस 7 के संबंध में एक मुद्दे के बारे में बात की। मुझे लगता है कि नेक्सस को इसके बजाय डिफ़ॉल्ट लेआउट मिल रहा है। – Korcholis

+0

हमें आपकी मदद करने के लिए बिल्कुल "क्या दिखता है" जानने की आवश्यकता होगी। –

उत्तर

25

खैर, यह आप पहले से ही पता चला है दो मतभेद हैं क्यों लगता है क्योंकि वे विभिन्न घनत्व पैमाने कारकों की रिपोर्ट में यह बताया गया है:

  • नेक्सस 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" पर बदलकर समान प्रतिमान ड्रॉबल्स (या किसी भी संसाधन) के लिए काम करता है।

+3

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

1

क्योंकि Nexus7 एक tvdpi डिवाइस यह लेआउट-sw600dp संपत्ति का उपयोग करता है (213dpi पर गणना के आधार पर), FireHD एक HDPI डिवाइस है और लेआउट-sw533dp संपत्ति का उपयोग कर समाप्त होता है (गणना के आधार पर 240dpi)

+3

क्यों? घनत्व की गणना पिक्सल/इंच द्वारा की जाती है। दोनों उपकरणों में एक ही रिज़ॉल्यूशन होता है, दोनों डिवाइसों में एक ही डिस्प्ले आकार होता है। तो वहां क्यों है एक घनत्व अंतर? – stoefln

1

शायद तुम लेआउट-tvdpi और लेआउट-hdpi इस्तेमाल करना चाहिए?

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