जब तक आप 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