एंड्रॉइड गेम को विभिन्न स्क्रीन आकारों में फिट करना


11

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

जवाबों:


11

जब तक आप AbsoluteLayout का उपयोग नहीं कर रहे हैं (आमतौर पर एक बहुत बुरा विचार, जैसा कि आप x / y निर्देशांक का उपयोग करके अपने लेआउट को डिज़ाइन करते हैं, जो केवल उस डिवाइस को सूट करेगा जिसे यह डिज़ाइन किया गया है) ऐसा नहीं होना चाहिए - Android एप्लिकेशन स्वचालित रूप से डिवाइस के स्क्रीन-आकार में समायोजित हो जाते हैं । हालाँकि आप जो वर्णन करते हैं (लेआउट टेबल स्क्रीन पर समायोजित नहीं होता है) से, ऐसा लगता है कि AbsoluteLayout यहां मुद्दा हो सकता है।

सुनिश्चित करें कि आपके लेआउट XML फ़ाइलों में आप पूर्ण लेआउट का उपयोग नहीं कर रहे हैं (इसमें किसी भी प्रकार के दृश्य पर स्पष्ट निर्देशांक / चौड़ाई / ऊँचाई सेट करना शामिल है)। इसके बजाय उपयोग करने पर विचार करें:

  • रेखीय लयआउट - कई दृश्यों को क्षैतिज या लंबवत रूप से ढेर करता है
  • फ्रेमलैटआउट - आमतौर पर एक बच्चा होता है
  • RelativeLayout - एक दूसरे के सापेक्ष बच्चों को संरेखित करें
  • टेबल -आउट - एक टेबल-आधारित लेआउट
  • स्क्रॉलव्यू - में एक चाइल्ड आइटम हो सकता है (जैसे कि एक लीनियरआउट) और इससे आप कंटेंट को स्क्रॉल कर सकते हैं

... जो भी सबसे अच्छा आपके उद्देश्य के अनुरूप है।

यदि आप Android पर नए हैं , तो Google एक अच्छा ट्यूटोरियल प्रदान करता है जो ऊपर वर्णित विभिन्न लेआउट प्रकारों से परिचय कराता है। अधिक ट्यूटोरियल यहां देखे जा सकते हैं

इसके अलावा आपका एपीआई स्तर प्रासंगिक होगा (यह जानने के लिए कि क्या आप एंड्रॉइड 2.x या 4.x का उपयोग कर रहे हैं - मुझे लगता है कि 3.x नहीं है क्योंकि यह स्मार्टफ़ोन के लिए उपलब्ध नहीं है) अपने मुद्दे का कारण जानने के लिए।

क्या आप सेटिंग द्वारा अपने एप्लिकेशन को पोर्ट्रेट मोड में मजबूर कर रहे हैं:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set screen orientation for this dialog to portrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

... आपकी गतिविधि में जो खेल के विचारों को प्रदर्शित करता है?

कृपया इस बारे में अधिक जानकारी प्रदान करें कि आप अपने विचारों को कैसे लेआउट कर रहे हैं (क्या आप XML का उपयोग उस लेआउट के लिए कर रहे हैं जिसे आप बाद में अपनी गतिविधि में बढ़ाते हैं, या क्या आप अपनी गतिविधि आदि में कोड लेआउट का उपयोग कर रहे हैं ....)? इसके अलावा: क्या आपने एक स्मार्टफ़ोन - और टेबलेट-आकार के एमुलेटर में अपना ऐप चलाने की कोशिश की? यदि हाँ, तो क्या समस्या बनी रहती है?


अद्यतन: कैसे स्कोर बिट्स के लिए

ओपी ने पूछा कि वह बिटमैप के पैमाने का उपयोग अपने खेल में कैसे कर सकता है। एक विकल्प (सभी मैं ओपी के सेटअप के बारे में जानता हूं): सर्फेसहॉल्डर.कॉलबैक जो आप अपने गेम को प्रदर्शित करने के लिए ओवरराइड कर रहे हैं और जिस पर आप सभी बिटमैप आदि को रेंडर करते हैं ... में एक विधि है:

surfaceChanged(SurfaceHolder holder, int format, int width, int height)

यह विधि आपको आपकी सतह की चौड़ाई / ऊँचाई प्रदान करती है, इसलिए अब आप इसका उपयोग कर सकते हैं:

Bitmap.createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)

से बिटमैप वर्ग । उस सतह के आकार के अनुपात में अपनी छवियों को आकार देने के लिए, जिस पर आप ड्राइंग कर रहे हैं।

आपको यह करने की आवश्यकता है: यदि आप किसी दिए गए स्क्रीन के संबंध में अपने बिटमैप के आयामों को जानते हैं, उदाहरण के लिए आपके स्मार्टफोन के स्क्रीन-आकार। फिर आप स्केल किए गए बिटमैप के लक्ष्य आयामों की गणना कर सकते हैं। यहाँ गणित है (उदाहरण में लिपटा हुआ):

मान लें कि आपके पास आयाम 25x50 (चौड़ाई x) के साथ एक बिटमैप ए है जो 100x200 (चौड़ाई x आयाम) के साथ स्क्रीन पर प्रदर्शित होता है। उस स्क्रीन आकार (100x200) के लिए बिटमैप के सही आयाम हैं - अब यदि आप बिटमैप को बड़े स्क्रीन पर प्रदर्शित करना चाहते हैं, तो आपको निम्न की आवश्यकता होगी:

  • बिटमैप आकार के लिए स्केल फैक्टर की गणना करें
  • बिटमैप के पहलू अनुपात को बनाए रखें (ताकि यह विकृत न हो)

कहते हैं कि बड़ी स्क्रीन 200x300 (चौड़ाई) है तो चौड़ाई के लिए स्केल-फैक्टर है:

200(target screen width)/100(default screen width) = 2

तो 2 बिटमैप की चौड़ाई और ऊंचाई मूल्य के लिए हमारा स्केल-फैक्टर है, क्योंकि हमें बिटमैप के पहलू अनुपात को बनाए रखने की आवश्यकता है, हम बस बिटमैप की चौड़ाई और ऊंचाई के साथ स्केल फैक्टर को गुणा कर सकते हैं:

bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight

इसलिए ऊपर और उल्लिखित सूत्र से हमारे उदाहरण बिटमैप ए का उपयोग करते हुए, बिटमैप के नए आयाम होंगे: 50x100 (widthxheight) क्योंकि:

 2*25(width) = 50 height
 2*50(height) = 100 height

अब जब हम अपने बिटमैप के नए आकार को जानते हैं तो हम बस मेरे द्वारा बताए गए एपीआई कॉल का उपयोग करते हैं और रिक्त स्थान को भरते हैं:

   Bitmap.createScaledBitmap (myBitmap, 50, 100, false)

उपरोक्त उदाहरण में myBitmap मूल बिटमैप ए है, जिसका आयाम 25x50 था और उपरोक्त कोड-स्निपेट का उपयोग करके इसे 50x100 तक बढ़ाया गया है।


हालाँकि - यह टैबलेट के आकार के डिवाइस के केवल ऊपरी दाएं कोने तक ले जाने के आपके मूल मुद्दे को हल नहीं करेगा। यह उत्तर देने के लिए कि हमें आपके सेटअप के संबंध में आपके द्वारा पूछे गए प्रश्नों के उत्तर की आवश्यकता होगी। मैं जल्दी से उन्हें यहाँ लाऊंगा:

  • क्या आप एक गेम इंजन का उपयोग कर रहे हैं जैसे कि AndEngine या Unity ?
  • क्या आप अपना लेआउट xml में लिख रहे हैं? यदि हाँ, तो अपने खेल सामग्री प्रदान करने के लिए आपका रूट-लेआउट क्या है?
  • आपने उल्लेख किया कि आप सरफेसहार्ड.कॉलबैक लागू कर रहे हैं? सतह की विधि कॉल में प्रदान की गई चौड़ाई / ऊंचाई आपको सतह का आकार देती है - क्या यह वही आकार है जब आपका ऐप स्मार्टफोन या टैबलेट पर चलता है?
  • क्या आपके पास भूतल व्यू तक पहुँच है (या जो भी उस सरफेसहोल्डर से जुड़ा है। आप जिस पर अमल कर रहे हैं, उसे वापस ले लें), इसलिए हम यह निर्धारित कर सकते हैं कि क्या यह ऐप आकार को स्मार्टफोन के आकार में सेट कर रहा है।
  • क्या अलग-अलग स्क्रीन रिज़ॉल्यूशन वाले एमुलेटर में समान आकार-मुद्दे होते हैं?

एक सामान्य संदेह: प्रत्येक स्मार्टफोन का स्क्रीन आकार एक जैसा नहीं होता है, वास्तव में स्क्रीन आकार की एक विस्तृत श्रृंखला होती है, जो मुझे आश्चर्यचकित करती है: क्या आपने कभी अपने ऐप को अपनी स्क्रीन से भिन्न स्क्रीन आकार वाले स्मार्टफोन पर परीक्षण किया था? क्योंकि - यह तथ्य कि यह आपकी स्क्रीन पर फिट बैठता है, लेकिन टैबलेट नहीं है, मुझे आश्चर्य होता है कि उन आयामों को कौन सेट करता है और कब। क्योंकि मुझे संदेह है कि कोई ऐप सभी स्मार्टफोन-स्क्रीन-आकारों में समायोजित हो सकता है, लेकिन टैबलेट के आकारों के लिए नहीं - इससे बहुत मतलब नहीं होगा (क्योंकि वे कमोबेश उसी एंड्रॉइड कोर पर चल रहे हैं, sx, 3 के बीच कुछ अंतर। x और 4.x एक तरफ) UNLESS आप एक ऐसे ढांचे का उपयोग कर रहे हैं जो समर्थन नहीं करता है (जो भी कारण से - शायद आपको टैबलेट समर्थन अतिरिक्त या जो भी खरीदना होगा) टैबलेट के आकार के स्क्रीन आकार। इसलिए यह जानना वास्तव में महत्वपूर्ण है कि क्या ऐप केवल आपके फोन पर ठीक से आकार लेता है, या अन्य स्मार्टफ़ोन पर भी। एकमात्र तरीका मुझे पता है कि कैसे एक एप्लिकेशन को एक विशिष्ट फोन के स्क्रीन आकार तक सीमित किया जा सकता है निरपेक्षता का उपयोग करके और आम तौर पर विगेट्स आदि के लिए पूर्ण आयाम ...


अद्यतन: स्केलिंग x / y निर्देशांक

अपने बिटमैप के स्थान को स्क्रीन के आकार में समायोजित करने के लिए, निम्नलिखित में से कुछ काम करना चाहिए:

  • स्क्रीन आयाम: 100/200 (चौड़ाई / ऊंचाई)
  • बिटमैप स्थान: x = 50 / y = 100

अब, यदि आप स्क्रीन का आकार बढ़ाते हैं, तो आपको उन x / y मानों को स्केल करना होगा:

  • स्क्रीन आयाम: 200/400 (चौड़ाई / ऊंचाई)

स्केल फैक्टर 2 होगा, क्योंकि चौड़ाई और ऊंचाई दो से समान रूप से बढ़ी। इसलिए आयाम होगा ...

  • बिटमैप स्थान: x = 100 / y = 200

एक और कोशिश - इस बार चौड़ाई / ऊंचाई के लिए विभिन्न पैमाने कारकों के साथ

  • स्क्रीन आयाम: 100/150 (चौड़ाई / ऊंचाई)
  • बिटमैप स्थान: x = 50 / y = 50

यदि नई लक्ष्य स्क्रीन 150/250 है तो गणना निम्न हैं:

  • चौड़ाई के लिए स्केल कारक = लक्ष्य / मूल / चौड़ाई = १.५
  • ऊंचाई के लिए स्केल कारक = targetHeight / originalHeight = 1.666 ... (अवधि)

अब हमें x / y निर्देशांक को स्केल करने की आवश्यकता है, चौड़ाई-स्केल का उपयोग करके x को स्केल किया जाता है और ऊंचाई-स्केल का उपयोग करके स्केल को स्केल किया जाता है, यहां परिणाम है:

  • x = ओरिजिनल * 1.5 = 75
  • y = मूल * 1.666 .. (अवधि) = 83.333 ... (अवधि)

इसलिए नए स्क्रीन आयाम और स्केल किए गए x / y निर्देशांक हैं:

  • चौड़ाई = 150
  • ऊँचाई = 250
  • x = 75
  • y = 83,333 ... (अवधि)

एक लंबी कहानी को छोटा करने के लिए, बिटमैप को स्केल करने के लिए एल्गोरिथ्म है:

X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate

मेरा गेम एक गेम पैनल का उपयोग करता है जो सर्फेसहॉल्डर.कॉलबैक (यह एक्सएमएल फ़ाइल में एक्टिविटी कहलाता है) तक फैली हुई है। क्या यह समस्या का हिस्सा हो सकता है?
user1404512

@ user1404512 एक SurfaceHolder.Callback आमतौर पर एक SurfaceView से जुड़ा हुआ है - और यह इस बात पर भी निर्भर करता है कि अगर यह किसी अन्य लेआउट (जैसे FrameLayout आदि) में एम्बेडेड है, तो SurfaceView कॉन्फ़िगर किया गया है (चौड़ाई / ऊंचाई) ... आपके SurfaceHolder.Callback में। एक विधि होनी चाहिए: सार्वजनिक शून्य भूतल (सरफेसहोल्डर होल्डर, इंट फॉरमेट, इंट चौड़ाई, इंट हाइट) चौड़ाई और ऊँचाई स्क्रीन पर खींची जाने वाली साइज़ की होनी चाहिए - जो आपके मामले में टैबलेट और स्मार्टफ़ोन पर समान होगी - आप इसे सत्यापित करते हैं?
AgentKnopf

हां, मुझे लगता है कि मुझे यह कहना चाहिए: जब मैं इसे अपने टैबलेट पर चलाता हूं, भले ही स्क्रीन का आकार बड़ा हो, सभी बिटमैप समान आकार के होते हैं। क्या बिटमैप्स को अलग-अलग आकार के स्क्रीन पर भी समान अनुपात में रखने का कोई तरीका है?
user1404512

@ user1404512 यह वास्तव में महत्वपूर्ण है, कि आप उन सभी सवालों के जवाब दें जो हमने आपसे पूछे थे, क्योंकि हम अभी भी अंधेरे में हैं कि आपका लेआउट कैसे बनाया गया है, जिससे किसी भी विशिष्ट प्रश्न का उत्तर देना मुश्किल हो जाता है। आपके बिटमैप्स के लिए: मैंने बिटमैप-स्केलिंग प्रश्न का उत्तर देने के लिए अपना उत्तर अपडेट किया, जो कि मेरे सेटअप के बारे में बहुत कम ज्ञात है।
AgentKnopf

नहीं, मैं गेम इंजन का उपयोग नहीं कर रहा हूं। मेरे पास xml में मेरा लेआउट है, और मेरी xml फ़ाइल में मेरे पास SurfaceHolder.Callback है जो पूरी स्क्रीन है। धारक की चौड़ाई और ऊंचाई स्क्रीन से स्क्रीन में बदल जाती है। मुझे लगता है कि मेरी समस्या यह है कि मैं एक्स और वाई निर्देशांक के साथ बिटमैप को आकर्षित कर रहा हूं, लेकिन बिटमैप्स का पैमाना स्क्रीन से स्क्रीन तक एक समान रहता है। क्या इसको ठीक करने का कोई तरीका है? आपका अग्रिम रूप से बोहोत धन्यवाद!
user1404512

3

Android.com पर एक अच्छा और प्रासंगिक लेख है: http://developer.android.com/guide/practices/screens_support.html

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

याद रखें कि लेआउट और उपस्थिति का परीक्षण करते समय आप एमुलेटर के लिए एंड्रॉइड वर्चुअल डिवाइसेस के विभिन्न कॉन्फ़िगरेशन भी बना सकते हैं: http://developer.android.com/guide/developing/devices/emulator.html


0

यहां अंधेरे में सिर्फ एक गोली। क्या आपने माता-पिता को लंबवत और क्षैतिज रूप से भरने के लिए मास्टर लेआउट जो भी निर्धारित किया है?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.