2012-10-26 18 views
11

में कटौती मेरे पास एक स्प्लिट लेआउट के साथ एक टैबलेट एप्लिकेशन है - बाईं ओर एक सूची, और दाईं ओर एक विस्तृत फलक। दायां हाथ फलक एक वेब व्यू है, और इसमें <video> टैग शामिल है। यह सब ठीक काम कर रहा है, वेबव्यू के पूरे दाएं हाथ को छोड़कर और सादा सफेद प्रस्तुत करता है।<video> के साथ आंशिक स्क्रीन वेबव्यू आधा

यह इस तरह क्यों प्रस्तुत कर रहा है, और मैं एक विशाल हैक डाले बिना इसे कैसे टाल सकता हूं?

मैंने इसे एक साधारण परीक्षण परियोजना में उबाला है, जिसे मैंने on github पोस्ट किया है।

यहां एक स्क्रीनशॉट: http://d.pr/i/dfEh है।

बाईं ओर ग्रे क्षेत्र जहां सूची दृश्य संबंधित है। मैंने सादगी के लिए इसे खाली FrameLayout में बदल दिया है। वेब व्यू आईएस के दाईं ओर कट ऑफ भाग सूची दृश्य के समान चौड़ाई है। यह भी ध्यान देने योग्य है कि वीडियो के नीचे कोई भी सामग्री काट दिया जाता है - सफेद क्षेत्र वेबव्यू की पूरी ऊंचाई बढ़ाता है।

कुछ बातें मैं कोशिश की है: जावास्क्रिप्ट, अवलोकन मोड

  • एक WebViewClient सेट के साथ विस्तृत व्यूपोर्ट, लोड का उपयोग करें:

    • सक्षम और अक्षम WebSettings कुछ और के साथ सूची दृश्य की जगह और WebChromeClient
    • हार्डवेयर त्वरण को
    • विभिन्न सेटटी चालू और बंद करें View.setScrollBarStyle में ngs, WebView.setVerticalScrollBarOverlay, और इसी तरह
    • <video> के h264 और aac, m3u8 साथ mp4 सहित ऊंचाई/चौड़ाई गुण और शैलियों
    • विभिन्न वीडियो प्रारूपों, और एक यूट्यूब RTSP धारा
    • विभिन्न उपकरणों tweak सहित, आग HD दिखाया गया है, एक नेक्सस 7, एक आकाशगंगा 10.1, और एक Xoom
    • Android संस्करण 3.1, 3.2, 4.0, 4,1

    वर्तमान वैकल्पिक हल:

    0,123,

    मैं एक पूर्ण-स्क्रीन वेबव्यू का उपयोग करके इसके चारों ओर काम कर रहा हूं, इसके शीर्ष पर अपनी सूची दृश्य को ओवरले कर रहा हूं, और HTML में बाहरी कंटेनर तत्व पर बाएं मार्जिन सेट कर रहा हूं। यह बल्कि हैकी है, और विभिन्न घनत्वों और संकल्पों पर सूची दृश्य का आकार प्राप्त करना त्रुटि-प्रवण है, इसलिए मैं वास्तव में इसे सही तरीके से हल करना चाहता हूं।

    स्निपेट्स:

    जैसा कि मैंने उल्लेख किया है, एक (गैर) टेस्ट बेड काम कर GitHub पर पोस्ट किया जाता है, लेकिन यहां महत्वपूर्ण बिट्स हैं:

    एचटीएमएल WebView में लोड (इस के सभी है यह):

    <html> 
    <head><title>Title</title></head> 
    <body style="margin:0"> 
        <video x-webkit-airplay="allow" controls="controls" style="width:100%"> 
         <source src="http://clips.vorwaerts-gmbh.de/VfE_html5.mp4"></source> 
        </video> 
    </body> 
    </html> 
    

    मुख्य लेआउट फ़ाइल:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:orientation="horizontal" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        > 
    
        <fragment android:name="com.concentricsky.android.webviewvideotest.ListFragment" 
         android:id="@+id/item_list" 
         android:layout_width="0dp" 
         android:layout_height="match_parent" 
         android:layout_weight="1" /> 
    
        <!-- The WebView is attached here --> 
        <FrameLayout android:id="@+id/detail_container" 
         android:layout_width="0dp" 
         android:layout_height="match_parent" 
         android:layout_weight="3" /> 
    
    </LinearLayout> 
    

    onCreateView में:

    View rootView = inflater.inflate(R.layout.fragment_detail, container, false); 
        webView = (WebView) rootView.findViewById(R.id.webview); 
        webView.setWebChromeClient(new WebChromeClient()); 
        webView.loadUrl("file:///android_asset/test.html"); 
        return rootView; 
    

    मैं वास्तव में यह एक से अधिक मेरे सिर खरोंच रहा हूँ, और मैं हैरान मैं इसके बारे में कोई उल्लेख नहीं मिल पाई किया गया हूँ। हालांकि, किसी भी इनपुट की सराहना की जाती है।

  • +0

    क्या आपने वेबव्यू में वीडियो एम्बेड करने के बजाय वीडियो व्यू ओवरले का उपयोग करने पर विचार किया है? – Phil

    +0

    यदि वेबव्यू पर वीडियो वीडियो व्यू की तरह है, तो यह एक सतह पर होगा, जो केवल एक हो सकता है, इसलिए आपने ListView हार्डवेयर त्वरण को बंद करने का प्रयास किया है। –

    +0

    @ निनिन्हो: यह वादा करता है। मैंने 'view.setLayerType (View.LAYER_TYPE_SOFTWARE, null) सेट करने का प्रयास किया है; सूची सूची में 'क्रिएटिव्यू' पर, लेकिन कोई बदलाव नहीं है। उस कॉल के साथ या उसके बिना, 'getLayerType'' पर कॉल, सूची और वेब दृश्य दोनों पर 'LAYER_TYPE_NONE' में परिणाम। सॉफ़्टवेयर परत का अनुरोध करने का कोई और तरीका है?एप्लिकेशन स्तर पर त्वरण को बंद करने से लेआउट समस्या ठीक हो जाती है, लेकिन निश्चित रूप से वीडियो प्रदर्शित नहीं होता है। – dokkaebi

    उत्तर

    1

    समस्या हार्डवेयर/ओपनएल परत के साथ प्रतीत होती है। चूंकि वीडियो व्यू वीडियो प्रस्तुत करने के लिए हार्डवेयर परत का उपयोग करता है, मेरा मानना ​​है कि वीडियो के साथ वेब व्यू के साथ ऐसा ही होता है।

    तो यदि आप परतों को सही सेट करते हैं, तो उन्हें एक-दूसरे के साथ हस्तक्षेप नहीं करना चाहिए, जैसे कि मैंने कॉमेंट्स पर कहा था, आपको हार्डवेयर त्वरण को अक्षम करने और इसे सक्षम करने के लिए सूची दृश्य को किसी भी या सॉफ़्टवेयर को ले जाना चाहिए वेब व्यू या खिड़की। http://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling

    1

    पर हार्डवेयर त्वरण के बारे में

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

    आप वास्तव में वहां मौजूद किसी भी घटक के पीछे 0 0 पर वेबव्यू को स्थानांतरित करके इस पर काम कर सकते हैं। फिर सीएसएस में सामग्री को सही स्थान पर रखने के लिए एक मार्जिन दें।

    यह साफ नहीं हो सकता है, लेकिन मुझे एक और समाधान नहीं मिला है।

    संपादित करें: अपने प्रश्न पर एक बेहतर नज़र डालने के बाद मुझे लगता है कि रिश्तेदार लेआउट के साथ इसका कोई संबंध नहीं है क्योंकि आप एक का उपयोग नहीं कर रहे हैं। फिर भी इस कामकाज ने मेरे लिए काम किया। तो मुझे लगता है कि 'वीडियो लेयर' 0,0 पर रहता है इससे कोई फर्क नहीं पड़ता कि आप किस लेआउट का उपयोग कर रहे हैं। मैं इस तरह से गैलेक्सी टैब 2 (एंड्रॉइड 4.0.3) पर इस समस्या से आया था।

    -1

    मेरे पास मास्टर/विस्तार प्रवाह लेआउट में एक ही समस्या थी। परत प्रकार को सॉफ़्टवेयर में सेट करके मेरे वीडियो को आधे मुद्दों में काटा जा रहा था। यह वेबव्यू के लिए हार्डवेयर त्वरण बंद कर देता है।

    webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    

    एफवाईआई मैंने केवल अमेज़ॅन टैबलेट पर इस मुद्दे का अनुभव किया।