मैं सोच रहा हूं कि एंड्रॉइड किस तरह से परिभाषित android:layout_width
और android:layout_height
मानों के साथ लेआउट दृश्यों के अंदर लेआउट दृश्यों के अंदर स्क्रीन पर विचार खींचता है।एंड्रॉइड गलत तरीके से किसी अन्य के अंदर (चौड़ाई और ऊंचाई पिक्सल में परिभाषित) के अंदर क्यों आकर्षित करता है?
मैं एंड्रॉइड क्लास व्यू का उपयोग कर रहा हूं android.view.SurfaceView
बढ़ाता है। एंड्रॉइड ऐप पर कैमरे से एमजेपीईजी स्ट्रीम प्रदर्शित करने के लिए यह सिर्फ MjpegView
है। मैं इस कोड के साथ काम कर रहा हूं (कुछ छोटे बदलावों के साथ): Android ICS and MJPEG using AsyncTask
यह MjpegView
कक्षा RelativeLayout
के अंदर रखा गया है। MjpegView
वस्तु प्रोग्राम के रूप में जोड़ दिया जाता है और इस RelativeLayout
गुण इस तरह से परिभाषित किया गया है:
android:layout_width="800px"
android:layout_height="600px"
यह आकार मान इस आवेदन के लिए आवश्यक है, ताकि मैं उन्हें बदल नहीं सकते। आवेदन केवल परिदृश्य अभिविन्यास में काम कर रहा है। मेरा MjpegView
RelativeLayout (800 x 600 px)
के अंदर 320 x 240
पिक्सेल आकार सेट करने की आवश्यकता है। वर्तमान डिवाइस पर स्क्रीन भरने के लिए मेरा एप्लिकेशन इस RealtiveLayout
को बढ़ाता है। और यह स्ट्रीमिंग एमजेपीईजी के साथ भी जुड़ी एक समस्या है। मैं नेक्सस 7 (2012 संस्करण) पर काम कर रहा हूं, जिसमें 1280 x 800
रिज़ॉल्यूशन है।
लेआउट के अंदर इस दृश्य का असली आकार प्राप्त करने के लिए मुझे नेक्सस 7 स्क्रीन की ऊंचाई को बिना कार्रवाई और नेविगेशन बार के मापना है। प्राप्त करने के लिए इस मैं एक Activity
अंदर इस विधि का इस्तेमाल किया है:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
RelativeLayout parentLayout = (RelativeLayout) findViewById(R.id.parent_layout);
if (parentLayout != null && isLandscape) {
this.measuredActivityHeight = parentLayout.getBottom();
}
}
मैं चल रहा है गतिविधि के measuredActivityHeight
रूप 703
मूल्य मिल रहा है। तो अनुपात प्राप्त करने के लिए है, जिसमें एंड्रॉयड तब्दील 320 x 240 px
अंदर 800 x 600 px
को dp
स्क्रीन मैं इस विधि में लिखा है पर मूल्य:
public int calculateForCurrentScreen(float pixelValue) {
float ratio = PageActivity.measuredActivityHeight/600f;
int result = (int) (pixelValue * ratio);
return result;
}
320 x 240 px
के लिए नेक्सस 7 मैं
374 x 281
हो रही है पर
तो। और यह आकार में MjpegView
पाने के लिए मैं MjpegView
वर्ग के अंदर इस विधि का उपयोग करने की आवश्यकता है:
public void setResolution(int width, int height) {
holder.setFixedSize(width, height);
}
और स्ट्रीमिंग दृश्य के आकार का वांछित आकार में है। लेकिन इस दृश्य में अतिरिक्त काले क्षेत्र हैं। तो वास्तव में पूरा दृश्य (कैमरे स्ट्रीम + इसके नीचे और दाएं तरफ काले क्षेत्र) 440 x 328
आकार है।
मैंने Rect
ऑब्जेक्ट को MjpegView
में 374 x 281
आकार के साथ चित्रित किया है, तो यह ठीक है। SurfaceHolder
और Canvas
में यह आकार भी है। Bitmap
ऑब्जेक्ट में 320 x 240
आकार है, लेकिन यह ठीक है क्योंकि Bitmap
ऑब्जेक्ट कैमरा स्ट्रीम से है। और यह वांछित आकार में बदल गया है।
समस्या गायब हो जाते हैं (वहाँ कोई काला क्षेत्रों और MjpegView
सही स्थिति और अन्य विचारों को आकार सापेक्ष में है) जब मैं 800dp x 600dp
आकार के RelativeLayout
बंद और MjpegView
वस्तु के लिए setResolution(320, 240)
आह्वान किया है। लेकिन पूरा लेआउट इस पल में बहुत बड़ा है।
संपादित
धन्यवाद अपनी टिप्पणी के लिए @mathiash। मैंने आपको अपनी समस्या दिखाने के लिए नेक्सस 7 (2012 संस्करण) से अभी स्क्रीनशॉट अपलोड किया है।
जैसा कि आप देख सकते हैं, हरा क्षेत्र RelativeLayout
परिभाषित 800 x 600 px
आकार के साथ है। http://trackfield.webcam.oregonstate.edu/
से एमजेपीईजी स्ट्रीम प्राप्त करने के लिए। मैंने इस यूआरएल का इस्तेमाल किया है: http://trackfield.webcam.oregonstate.edu/axis-cgi/mjpg/video.cgi?resolution=320x240
।
इस स्क्रीनशॉट के लिए मैंने setResolution(320, 240)
विधि का आह्वान किया है। और काले क्षेत्र में 374 x 281
और वीडियो स्ट्रीम 320 x 240
है।
इस स्क्रीनशॉट के लिए मैं setResolution(374, 281)
विधि लागू कर दिया है। और काला क्षेत्र बहुत बड़ा है और वीडियो स्ट्रीम 374 x 281
है। और इस मामले में वीडियो स्ट्रीम में सही आकार है लेकिन यह काला क्षेत्र अनावश्यक है।
क्षमा करें मुझे आपका प्रश्न – pskink
याद आया यह सवाल दिलचस्प है, लेकिन, मुझे खेद है, बल्कि समझने में मुश्किल है। :/शायद एक स्क्रीनशॉट उपयोगी होगा? – matiash
@ मतिश आपकी टिप्पणी के लिए धन्यवाद, मैंने अपने प्रश्न को स्रीनशॉट्स – woyaru