2014-06-09 5 views
6

मैं सोच रहा हूं कि एंड्रॉइड किस तरह से परिभाषित 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" 

यह आकार मान इस आवेदन के लिए आवश्यक है, ताकि मैं उन्हें बदल नहीं सकते। आवेदन केवल परिदृश्य अभिविन्यास में काम कर रहा है। मेरा MjpegViewRelativeLayout (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 है।

320x240

इस स्क्रीनशॉट के लिए मैं setResolution(374, 281) विधि लागू कर दिया है। और काला क्षेत्र बहुत बड़ा है और वीडियो स्ट्रीम 374 x 281 है। और इस मामले में वीडियो स्ट्रीम में सही आकार है लेकिन यह काला क्षेत्र अनावश्यक है।

374x281

+0

क्षमा करें मुझे आपका प्रश्न – pskink

+1

याद आया यह सवाल दिलचस्प है, लेकिन, मुझे खेद है, बल्कि समझने में मुश्किल है। :/शायद एक स्क्रीनशॉट उपयोगी होगा? – matiash

+0

@ मतिश आपकी टिप्पणी के लिए धन्यवाद, मैंने अपने प्रश्न को स्रीनशॉट्स – woyaru

उत्तर

2

Levente Kurusa के रूप में सुझाव दिया, इस तरह के डी पी के रूप में एक आभासी पिक्सेल इकाई का उपयोग कर अपनी समस्या का समाधान कर सकते हैं। हमें सीधे पीएक्स का उपयोग करने से बचना चाहिए।

+0

जैसा कि मैंने टिप्पणी में टिप्पणी में उल्लेख किया है: मैंने '800 x 600 के साथ प्रयास किया है डीपी 'आकार भी। और यह ठीक दिखता है (काला क्षेत्र के बिना), लेकिन मेरा ऐप दो अंगुलियों के इशारे के साथ ज़ूमिंग का समर्थन करता है, और इस काले क्षेत्र में भी दिखने वाले कारणों में ज़ूमिंग का समर्थन करता है ... - इसलिए डीपी या पिक्सेल का उपयोग समाधान नहीं है। मैं एक समाधान की तलाश में हूं कि 'SurfaceView' को विस्तारित करने वाले दृश्य के आकार को जटिल कैसे बनाया जाए – woyaru

1

डीपी का उपयोग न करें, विभिन्न स्क्रीन के साथ डीपी परिवर्तन भी न करें। इसके बजाय मैंने अपने मूल्य के समय घनत्व का उपयोग करना सीखा। तो प्रदर्शन मेट्रिक्स मेट्रिक्स = getResources() का उपयोग करें। GetDisplayMetrics(); और उदाहरण के लिए metrics.getDensity() * 50। विभिन्न स्क्रीनों में उन्हें सापेक्ष रखने के लिए वजन का उपयोग करने का भी प्रयास करें।

0

आप का सबसे अच्छा फिटिंग बनाने के लिए क्रम में

whateveryourvideoname.setDisplayMode(MjpegView.SIZE_BEST_FIT) 

साथ कोशिश कर सकते हैं अपने inputstream लेआउट दृश्य के भीतर (यदि आप पहले सेट किए गए संकल्प के साथ)।


लेकिन अगर आप अपने स्रोत छवि के संकल्प के रूप में एक ही आकार के साथ layout.xml फ़ाइल में अपने Mjpegview परिभाषित किया है यह सब मतलब नहीं है, तो सबसे अच्छा तरीका है setResolution आदेश को छोड़ने के लिए और बस का उपयोग करें

whateveryourvideoname.setDisplayMode(MjpegView.SIZE_FULLSCREEN) 

और आपकी छवि पूरी तरह से आपके MjpegView डिस्प्ले के अंदर फिट हो जाएगी।

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