2012-10-26 7 views
11

Ho un'applicazione per tablet con un layout diviso: un elenco a sinistra e un riquadro di dettagli a destra. Il riquadro a destra è una WebView e contiene un tag <video>. Funziona tutto bene, tranne che l'intero lato destro di WebView è tagliato e reso di un semplice bianco.WebView a schermo parziale con <video> tagliato a metà

Perché è il rendering in questo modo, e come posso evitarlo senza inserire un enorme hack?

L'ho ridotto a un semplice progetto di test, che ho pubblicato on github.

Ecco un screenshot: http://d.pr/i/dfEh.

L'area grigia sulla sinistra è il punto in cui appartiene la vista elenco. L'ho modificato in un FrameLayout vuoto per semplicità. La parte tagliata lungo il lato destro di WebView IS ha la stessa larghezza della visualizzazione elenco. Vale anche la pena notare che qualsiasi contenuto sotto il video viene troncato - l'area bianca estende l'intera altezza di WebView.

alcune cose che ho provato:

  • sostituire la visualizzazione elenco con qualcos'altro
  • attivare e disattivare WebSettings: javascript, largo uso viewport, carico con modalità panoramica
  • impostare un WebViewClient e WebChromeClient
  • Accensione e spegnimento dell'accensione hardware
  • vari setti NGS in View.setScrollBarStyle, WebView.setVerticalScrollBarOverlay, e simili
  • tweak
  • vari dispositivi l'altezza/attributi di larghezza e stili
  • vari formati video, tra cui MP4 con H264 e AAC, M3U8 <video> 's, e un flusso RTSP youtube, tra cui Fuoco HD mostrato, un Nexus 7, un Galaxy 10.1, ed un Xoom
  • le versioni di Android 3.1, 3.2, 4.0, 4,1

soluzione attuale:

Ho finito per aggirare questo problema utilizzando una visualizzazione Web a schermo intero, sovrapponendo la mia visualizzazione elenco su di essa e impostando un margine sinistro sull'elemento contenitore più esterno nel html. Questo è piuttosto hacky, e ottenere la dimensione della visualizzazione elenco su varie densità e risoluzioni è soggetta a errori, quindi mi piacerebbe davvero risolvere questo nel modo giusto.

Snippets:

Come ho già detto, una (non) lavoro banco di prova è pubblicato su GitHub, ma qui ci sono i pezzi importanti:

Html caricato nella WebView (questo è tutto esso):

<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> 

Il file di layout principale:

<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> 

In 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; 

Sono davvero graffiare la mia testa su questo uno, e sono sorpreso che non sono stato in grado di trovare qualsiasi menzione di esso. Qualsiasi input è apprezzato, per quanto inverosimile.

+0

Hai considerato di utilizzare una sovrapposizione VideoView invece di incorporare un video nella visualizzazione Web? – Phil

+0

Se il video sul Webview è come una VideoView, sarà su una superficie, che può essere solo una, quindi hai provato a disattivare l'accelerazione dell'hardware di ListView. –

+0

@nininho: Sembra promettente. Ho provato a impostare 'view.setLayerType (View.LAYER_TYPE_SOFTWARE, null);' nel frammento di lista 'onCreateView', ma non ci sono cambiamenti. Con o senza quella chiamata, una chiamata a 'getLayerType' risulta in' LAYER_TYPE_NONE' sia nella lista che nelle viste web. C'è un altro modo per richiedere un livello software?Disattivare l'accelerazione a livello di applicazione corregge il problema del layout, ma ovviamente causa la mancata visualizzazione del video. – dokkaebi

risposta

1

Il problema sembra essere con il livello hardware/opengl. Dato che VideoView utilizza un livello hardware per il rendering del video, credo che lo stesso accada con la visualizzazione Web con un video.

Quindi, se si impostano i livelli corretti, non dovrebbero interferire tra loro, quindi come detto in precedenza, è necessario impostare ListView su layer none o software, per disabilitare l'accelerazione hardware e abilitarlo sul webView o la finestra.

Maggiori informazioni su l'accelerazione hardware in http://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling

1

ho avuto lo stesso problema, ha dovuto con me utilizzando un layout relativo. Il livello a cui rende il video non si sposta con la visualizzazione Web. Quindi renderà il video come se la webview fosse posizionata a 0,0.

È possibile aggirare il problema posizionando effettivamente la visualizzazione Web su 0 0, dietro eventuali componenti già presenti. Quindi in css dare al contenuto un margine per posizionarlo nel punto corretto.

Potrebbe non essere pulito, ma non ho trovato un'altra soluzione.

MODIFICA: dopo aver esaminato meglio la tua domanda, penso che non abbia nulla a che fare con il layout relativo in quanto non lo stai utilizzando. Tuttavia questa soluzione ha funzionato per me. Quindi immagino che il 'Livello video' rimanga a 0,0 indipendentemente dal layout che stai utilizzando. A proposito, ho trovato questo problema solo su un Galaxy Tab 2 (Android 4.0.3).

-1

Ho avuto lo stesso problema in un layout di flusso principale/dettaglio. Impostando il tipo di livello su software, il mio video tagliato a metà era sparito. Ciò disattiva l'accelerazione hardware per la visualizzazione Web.

webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

FYI Ho riscontrato questo problema solo su Amazon Tablets.

Problemi correlati