Android 带有<;视频>;一分为二
我有一个平板电脑应用程序,它有一个拆分布局,左边是一个列表,右边是一个详细信息窗格。右侧窗格是一个WebView,其中包含一个Android 带有<;视频>;一分为二,android,android-webview,html5-video,Android,Android Webview,Html5 Video,我有一个平板电脑应用程序,它有一个拆分布局,左边是一个列表,右边是一个详细信息窗格。右侧窗格是一个WebView,其中包含一个标记。这一切都很好,除了WebView的整个右侧被切断并呈现纯白色 为什么要以这种方式渲染,如何在不插入大量黑客的情况下避免它? 我把它归结为一个简单的测试项目,我已经发布了 这是一个屏幕截图: 左侧的灰色区域是列表视图所属的区域。为了简单起见,我将其更改为空的FrameLayout。网络视图右侧的截断部分与列表视图的宽度相同。还值得注意的是,视频下方的任何内容也会被切断
标记。这一切都很好,除了WebView的整个右侧被切断并呈现纯白色
为什么要以这种方式渲染,如何在不插入大量黑客的情况下避免它?
我把它归结为一个简单的测试项目,我已经发布了
这是一个屏幕截图:
左侧的灰色区域是列表视图所属的区域。为了简单起见,我将其更改为空的FrameLayout
。网络视图右侧的截断部分与列表视图的宽度相同。还值得注意的是,视频下方的任何内容也会被切断——白色区域延伸了网络视图的整个高度
我尝试过的一些事情:
- 用其他内容替换列表视图
- 启用和禁用
:javascript,使用宽视口,以概览模式加载WebSettings
- 设置
和WebViewClient
WebChromeClient
- 打开和关闭硬件加速
、View.setScrollBarStyle
等中的各种设置WebView.setVerticalScrollBarOverlay
- 调整
的高度/宽度属性和样式 - 各种视频格式,包括带有h264和aac的mp4、m3u8和youtube rtsp流
- 各种设备,包括所示的Fire HD、Nexus 7、Galaxy 10.1和Xoom
- Android版本3.1、3.2、4.0、4.1
我对这件事真是摸不着头脑,我很惊讶我竟然找不到任何关于这件事的提及。无论多么牵强,任何输入都值得赞赏。问题似乎在于硬件/opengl层。由于VideoView使用硬件层来渲染视频,我相信同样的情况也会发生在带有视频的webView上 因此,如果您设置正确的层,它们不应该相互干扰,因此就像我在coments上所说的,您应该将ListView设置为layer none或software,以禁用硬件加速,并在webView或窗口上启用它
更多关于硬件加速的信息我也有同样的问题,我必须使用相对布局。它将视频渲染到的层不会随webview移动。因此,它将渲染视频,就好像webview位于0,0 您可以通过实际将webview定位在0处,位于任何可能已经存在的组件后面来解决此问题。然后在css中给内容留一个空白,以便将其定位在正确的位置 它可能不干净,但我还没有找到其他解决办法
编辑:在仔细看了你的问题之后,我认为这与相对布局无关,因为你没有使用相对布局。尽管如此,这种变通方法还是对我有效。所以我猜无论你使用什么布局,“视频层”都会保持在0,0。顺便说一下,我只是在Galaxy Tab 2(android 4.0.3)上遇到了这个问题。我在主/详细流程布局中也遇到了同样的问题。通过将图层类型设置为软件,我的视频被切成两半的问题就消失了。这将关闭webview的硬件加速
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
仅供参考,我只在亚马逊平板电脑上遇到过这个问题 您是否考虑过使用VideoView覆盖而不是在webview中嵌入视频?如果webview上的视频类似于VideoView,它将位于曲面上,曲面只能是一个曲面,因此您是否尝试过关闭ListView硬件加速功能。@nininho:这听起来很有希望。我试过设置
view.setLayerType(view.LAYER\u TYPE\u软件,null)在列表片段的onCreateView
中,代码>,但没有更改。无论是否使用该调用,对getLayerType
的调用都会在列表视图和web视图上产生LAYER\u TYPE\u NONE
。是否有其他方法请求软件层?在应用程序级别关闭加速可以修复布局问题,但当然会导致视频无法显示。@Phil是的,事实上效果很好。我有一个人工需求,需要使用一些现有的web代码。我可能会抛出一些javascript来拦截html视频播放器上的状态更改,隐藏它,然后调用Android代码来启动视频视图,但这对我来说就像我正在做的布局舞蹈一样,既粗糙又脆弱。如果我可以删除或重写网页代码,那么你的答案就是正确的。@f20k:不幸的是,我从来没有想到过比css左边距黑客更好的方法。
<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>
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;
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);