首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xamarin表单:提前暂停webview中的视频或音频播放

Xamarin表单:提前暂停webview中的视频或音频播放
EN

Stack Overflow用户
提问于 2020-06-15 04:59:02
回答 1查看 359关注 0票数 0

我正在使用自定义的网络视图来播放视频和音频。我需要暂停视频时,单击后退按钮从视频或音频页面。我从线程尝试了下面的解决方案,但是它不起作用。

代码语言:javascript
运行
复制
string pausefunctionString = @"var videos = document.querySelectorAll('video');  
                        [].forEach.call(videos, function(video) { video.pause(); });
                        ";
web_view.Eval(pausefunctionString);

我的数据有两种格式:

  1. 单独的视频或音频链接。
  2. 具有多个视频链接的HTML数据。

以上解决方案不适用于ios和windows两种格式。但是当webview的源是一个视频URL时,它对android是有效的。当源是HTML数据时,此解决方案在android中无法工作。

为了解析HTML数据,我使用了以下代码:

代码语言:javascript
运行
复制
string htmlData = "htmldata";
var htmlSource = new HtmlWebViewSource();
htmlSource.Html = htmlData;
advanced_web_view.Source = htmlSource;

,我也需要一个透明的背景为我的网页。我尝试了以下2种代码,但没有获得透明的背景。

代码语言:javascript
运行
复制
//code1
this.BackgroundColor = UIColor.Clear;
//code2
this.Opaque = false;
this.BackgroundColor = Color.Transparent.ToUIColor();

更新

我已经解决了视频或音频暂停问题在ios上以一种简单而棘手的方式。

我只是将webview源或Url值设置为如下所示的空白数据。所以当我从视频页面转到另一个页面时,视频就会自动停止。

代码语言:javascript
运行
复制
web_view.Source = "";
web_view.Url= "";

这种方法只适用于ios;对于android和windows,这种方法没有任何效果。那么,请您提出一种在android和windows中暂停视频的方法好吗?

我的数据有两种格式:

  1. 单独的视频或音频链接。
  2. 具有视频链接的HTML数据。

当webview的源仅为视频或音频URL时,下面的代码适用于android。当源是HTML数据时,此解决方案在android中无法工作。

代码语言:javascript
运行
复制
string pausefunctionString = @"var videos = document.querySelectorAll('video');  
                        [].forEach.call(videos, function(video) { video.pause(); });
                        ";
web_view.Eval(pausefunctionString);

结论

  1. 视频或音频暂停并不适用于两种数据格式的窗口(上面提到过),需要一种解决方案。
  2. 对于安卓,当源是HTML数据时,视频不会暂停,需要一个解决方案来解决这个
  3. 我认为我们可以忘记在ios平台上暂停的视频。

我还附加了一个更新的不同数据格式的文件

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-16 09:59:21

您需要在自定义呈现器中调用JS代码。

在自定义的webview中

代码语言:javascript
运行
复制
public Action<string> EvaluateJS;
public void OnEvaluate(string script)
{
    EvaluateJS(script);
}

在自定义渲染器中

代码语言:javascript
运行
复制
protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
        {
            base.OnElementChanged(e);

            if (Control == null)
            {
                var config = new WKWebViewConfiguration();
                config.AllowsInlineMediaPlayback = true;

                wkWebView = new WKWebView(Frame, config);
                SetNativeControl(wkWebView);
            }

            if (e.NewElement != null)
            {
                Control.LoadRequest(new NSUrlRequest(new NSUrl(Element.Url)));

                Element.EvaluateJS +=  (script) =>
               {
                   wkWebView.EvaluateJavaScript(script, (result, error) =>
                   {
                    });
               };

            }
        }

用法

代码语言:javascript
运行
复制
private void Button_Clicked(object sender, EventArgs e)
{
    string pausefunctionString = @"var videos = document.querySelectorAll('video');  
                [].forEach.call(videos, function(video) { video.pause(); });
                ";
    web_view.EvaluateJS(pausefunctionString);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62381618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档