Xamarin.Forms 中的计时器

2023-11-30

我想构建自己的音频播放器(因为没有可用的插件)。我使用滑块来显示玩家的进度。我可以允许用户在移动滑块时转到特定位置,但我无法将其与正在播放的录音同步。

Form

int i = 1;
Button btnPlay = new Button
{
    Text = "Play/Pause",
    Command = new Command(() =>
    {
        DependencyService.Get<IAudio>().PlayMp3File();
        TimeSpan tmspan = new TimeSpan(00, 00, 00);
        label.Text = String.Format("{0:hh\\:mm\\:ss}", tmspan.Add(TimeSpan.FromMilliseconds(i)));
        i++;
        return true;
    })
};
Button btnStop = new Button { Text = "Stop" };
TimeSpan timeSpan = DependencyService.Get<IAudio>().GetInfo();
Label lblDuration = new Label { Text = String.Format("{0:hh\\:mm\\:ss}", timeSpan) };

var slider = new Slider {
    Minimum = 0,
    Maximum = timeSpan.TotalHours,
};
var label = new Label {
    Text = "Slider value is 0",
    FontSize = 25,
    HorizontalOptions = LayoutOptions.Start,
};
slider.ValueChanged += 
    (sender, e) => 
    {
        label.Text = String.Format("Slider value is {0:hh\\:mm\\:ss}", TimeSpan.FromMilliseconds(e.NewValue));
        DependencyService.Get<IAudio>().SeekTo(Convert.ToInt32(e.NewValue));
    };
MainPage = new ContentPage
{
    Content = new StackLayout 
    {
        Children = 
        {
            btnPlay,
            btnStop,
            slider,
            lblDuration,
            label
        }
    },  
    Padding = new Thickness (10, Device.OnPlatform (20, 0, 0), 10, 5)
};

Service

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using AudioTest.Droid;
using Xamarin.Forms;
using Android.Media;
using System.Threading.Tasks;

[assembly: Dependency(typeof(AudioService))]

namespace AudioTest.Droid
{
    public class AudioService : IAudio
    {
        public AudioService() { }

        MediaPlayer player = null;

        public async Task StartPlayerAsync()
        {
            try
            {
                if (player == null)
                {
                    player = new MediaPlayer();
                    player = MediaPlayer.Create(global::Android.App.Application.Context, Resource.Raw.test);
                    player.Start();
                }
                else
                {
                    if (player.IsPlaying == true)
                    {
                        player.Pause();
                    }
                    else
                    {
                        player.Start();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.Out.WriteLine(ex.StackTrace);
            }
        }

        public void StopPlayer()
        {
            if ((player != null))
            {
                if (player.IsPlaying)
                {
                    player.Stop();
                }
                player.Release();
                player = null;
            }
        }

        public async Task PlayMp3File()
        {
            await StartPlayerAsync();
        }

        public void Stop()
        {
            this.StopPlayer();
        }

        public async Task SeekTo( int s)
        {
            await seekTo(s);
        }

        public double CurrentPosition()
        {
            if ((player != null))
            {
                return player.CurrentPosition;
            }
            else
            { return 0; }
        }

        private async Task seekTo(int mseconds)
        {
            if (player == null)
            {
                player = new MediaPlayer();
                player = MediaPlayer.Create(global::Android.App.Application.Context, Resource.Raw.test);

            }

            player.SeekTo(mseconds);
            player.Start();
        }



        public TimeSpan GetInfo()
        {
            int arr;
            if (player == null)
            {
                player = new MediaPlayer();
                player = MediaPlayer.Create(global::Android.App.Application.Context, Resource.Raw.test);

            }
            arr = player.Duration;

            return TimeSpan.FromMilliseconds(arr);//TimeSpan.FromMilliseconds(arr).TotalMinutes;
        }
    }
}

有人知道如何去做吗?

Edit Screenshot of the screen enter image description here

在播放时,计时器应该启动,并且我的滑块值应该增加。暂停时,计时器和滑块应暂停,停止时应停止。


看一眼Device班级在Xamarin.Forms特别是在StartTimer method.

鉴于此,您可以设置计时器:

Device.StartTimer(TimeSpan.FromMilliseconds(300.0), TimerElapsed);

private bool TimerElapsed()
{
    Device.BeginInvokeOnMainThread(() => 
    {
        //put here your code which updates the view
    });
    //return true to keep timer reccurring
    //return false to stop timer
}

大约每 300 毫秒触发一次(取决于设备功能)

关于您的代码,您可以从类似的内容开始:

1.将以下内容添加到您的播放命令中:

Device.StartTimer(TimeSpan.FromSeconds(1.0), CheckPositionAndUpdateSlider);

2.Add CheckPositionAndUpdateSlider方法 :

private bool CheckPositionAndUpdateSlider()
{
    var position = DependencyService.Get<IAudio>().GetCurrentPosition();
    Device.BeginInvokeOnMainThread(() => 
    {
         slider.Value = position;
    });
    return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin.Forms 中的计时器 的相关文章

随机推荐

  • 将 NiFi 中同一列中的字符串值替换为整数值

    我想更换一个 字符串值 并将该值输入为整数值使用 Nifi ReplaceText 我不知道如何在 NiFi 中实现这一点 所以我的场景如下 我将有一个 CSV 文件 其中包含几个带有整数的字段和几个作为字符串总值的字段 对于具有字符串值的
  • onclick 显示 div,但在单击其他 div 时隐藏

    我正在使用本主题答案 1 中的代码 显示 div onclick 并隐藏触发它的图像 img src Icons note add png then the function would apply a display none to it
  • 将阿拉伯语文本转换为 HTML 代码字符

    我正在尝试发送一封包含阿拉伯文本的电子邮件 我的问题是 当我将阿拉伯文本添加到电子邮件中时 它会将其更改为随机字母 与电子邮件的字符编码有关 我无法更改 是否有内置函数或自定义函数可以用来将阿拉伯语转换为 HTML 代码 以便它随后出现在我
  • BigQuery 中的“立即关注”页面路径

    我正在 BigQuery 中工作 以了解有多少用户完成了特定的页面路径 在会话中的任何时刻 假设页面路径是第 1 页 gt 第 2 页 gt 第 3 页 页面必须按顺序排列 我可以使用 BQ 建立页面路径 但此方法仅适用于识别在会话中的任何
  • 如何在 Windows 服务中为 Clearcase View 映射网络驱动器?

    我想在 Windows 服务内的网络驱动器上映射 Clearcase 视图 我尝试过net use命令 但无法正常工作 您应该能够运行与该命令相同类型的命令当路径太长时使用 即subst subst X c path to my View
  • 将指针传递给函数值不会改变[重复]

    这个问题在这里已经有答案了 include
  • Spring Integration - 以编程方式创建/拆卸通道

    是否可以以编程方式创建 拆卸 Spring Integration 通道 而不是在 Spring 配置中静态声明它们 我的情况是这样的 我有一个需要推送通知的网络应用程序 因此我使用长轮询 这些长轮询调用需要在服务器上阻塞 直到收到事件 我
  • JavaScript(ES6):在条件表达式中使用扩展运算符(?-运算符)[重复]

    这个问题在这里已经有答案了 在 JavaScript 中 可以使用以下方法将数组与另一个数组合并 扩展 运算符如下 1 2 3 4 5 6 gt 1 2 3 4 5 6 但是 似乎没有资格在三元内部使用扩展运算符 表达 true 1 2 3
  • 对 URL 参数进行解码

    我正在与一个服务器交谈 该服务器过去向我发送如下 HTTP 字符串 path to my handler action query id 112 type vca info ch 0 type event ev16 sts begin 因此
  • 打开时仅展开 viewPanel 中的一些分类列

    我正在使用 ViewPanel 来显示分类视图 该视图有 4 列类别 总计还有 3 个附加列 我想打开此视图 以便展开前 3 个分类列 并折叠第 4 个分类列 是否有某种类型的 SSJS CSJS 我可以添加到可以执行此操作的视图中 在 v
  • 如何跨两个不同的域使用 cookie?

    我需要使用 cookie 在两个不同域之间共享 SSO 信息 这可以在 PHP 中完成吗 如何实现 在两个域上 放置从另一个域中提取的图像或其他 Web 元素 使用 URL 通知其他域用户 X 位于域 A 上 并让域 B 将该用户 ID 与
  • 如何创建一个水平菜单,其中每个项目的宽度和间距相等?

    这是我到目前为止所得到的 fiddle 但它有两个问题 我已经硬编码了每个的宽度li to 33 我不想这样做 这样我就可以轻松添加更多项目 我想在每个项目之间放置一些间距 背景颜色中的间隙 但是一旦我添加边距 一个项目就会沿着一条线向下移
  • 在会话中存储用户ID?

    为了呈现用户特定数据 我在哪里存储当前登录用户的 userID 会议 是的 会议是提供该信息的合适场所 假设您正在使用 ASP NET 框架中内置的身份验证功能 您将要么从 HttpContext Current User Identity
  • 为什么 sklearn.feature_selection.RFECV 每次运行给出不同的结果

    我尝试进行特征选择RFECV但每次都会给出不同的结果 交叉验证是将样本 X 划分为随机块还是顺序确定性块 另外 为什么分数不同grid scores and score X y 为什么分数有时是负数 交叉验证是否将样本 X 划分为随机块或顺
  • 请求“.requestServerAuthCode”时,Google 登录 8.3.0 中出现错误 12500

    使用新的 google sign 8 3 0 登录可以正常工作 直到请求 requestServerAuthCode client id from web application under Oauth 2 0 client ids 看起来
  • SQL 将汇总行添加到 MySQL 结果集

    如果我有一个 MySQL 表 例如 我想用SQL来计算总和PositiveResult专栏以及NegativeResult柱子 通常我可以简单地做SUM PositiveResult 在查询中 但是 如果我想更进一步 将总计放在结果集底部的
  • 在 Mac 上使用 Qt 捕获停靠栏图标上的单击事件

    我正在尝试在 Mac OS X 上获取停靠图标上的停靠单击事件 我正在使用 Qt Cocoa 任何帮助将不胜感激 谢谢 拉胡尔 我已经为一个开源项目做到了这一点 请参阅此处的代码 https github com KDAB Charm bl
  • ASP.NET开发服务器中的缓存

    细节 我在 Windows XP SP3 上使用 Visual Studio 2005 该网站存储在文件系统上 我使用 subversion 从服务器检出代码 问题是这样的 当我第一次运行该应用程序时 一切都很好 但是 当我在应用程序中进行
  • 自定义相机照片未显示在 Windows 资源管理器中

    我已经按照 android 网站上有关如何创建自定义相机应用程序的说明进行操作 到目前为止我已经成功了 我创建了一个带有拍照按钮的布局 它工作正常 图像使用Camera PictureCallback 问题是 当我用电缆将手机连接到电脑时
  • Xamarin.Forms 中的计时器

    我想构建自己的音频播放器 因为没有可用的插件 我使用滑块来显示玩家的进度 我可以允许用户在移动滑块时转到特定位置 但我无法将其与正在播放的录音同步 Form int i 1 Button btnPlay new Button Text Pl