maui 开发音乐播放APP 优化(2)

界面改为:

在这里插入图片描述
音量可以调整 。同时当前状态 显示。以及播放音乐.视频有时可以自动播放有时候要手动。

界面代码

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
             x:Class="video.MainPage"
                Title="视频音频播放示例">
    <ScrollView>
        <VerticalStackLayout
			Spacing="25"
			Padding="30,0"
			VerticalOptions="Center">
            <Button  x:Name="btn" Text="播放音乐" Clicked="Button_Clicked" />
            <toolkit:MediaElement x:Name="audioMediaElement"
                      IsVisible="False"
                      Source="embed://3773192759.mp3"
                      />
            <toolkit:MediaElement x:Name="videoMediaElement"
                Loaded="videoMediaElement_Loaded"
                ShouldAutoPlay="True"
                Aspect="AspectFill"
                Source="embed://AndroidVideo.mp4"/>
            <HorizontalStackLayout>
                <Label FontAttributes="Bold"  Text="Volume" />
                <Slider Maximum="1.0"
                    Minimum="0.0"
                    Margin="10,0,10,0"
                    Value="{Binding Volume}"
                    WidthRequest="300" />
                <Label Text="{Binding Volume, StringFormat='{0:F2}'}" />
                <Label FontAttributes="Bold" Text="Position:"
                       Margin="10,0,10,0"/>
                <Label Text="{Binding Position}" />
                <Label FontAttributes="Bold" Text="State:"
                       Margin="10,0,10,0"/>
                <Label Text="{Binding State}" />
                <Label FontAttributes="Bold" Text="Media Status:"
                       Margin="10,0,10,0"/>
                <Label Text="{Binding MediaStatus}" />
            </HorizontalStackLayout>
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>

C#的代码:

using CommunityToolkit.Maui.Core.Primitives;
using CommunityToolkit.Maui.Views;
namespace video;
public static class Extensions
{
    public static string ToShortTimeString(this TimeSpan t)
    {
        string ret = "";

        // 小时部分
        if (t.Hours > 0)
            ret = $"{t.Hours}:";

        // 分钟部分
        if (t.TotalMinutes > 0)
        {
            if (t.Hours == 0)
                ret += $"{t.Minutes}:";
            else
                ret += $"{t.Minutes.ToString("D2")}:";
        }
        // 秒部分
        if (t.TotalSeconds > 0)
            ret += $"{t.Seconds.ToString("D2")}";
        else
            ret += "00";
        return ret;
    }
}
public partial class MainPage : ContentPage
{
    private string mediaStatus = string.Empty;


    // 媒体状态属性
    public string MediaStatus
    {
        get => mediaStatus;
        private set
        {
            mediaStatus = value;
            OnPropertyChanged(nameof(MediaStatus));
        }
    }


   
    // 播放器状态属性
    public string State
    {
        get
        {
            if (videoMediaElement != null)
            {
                return Enum.GetName(typeof(MediaElementState), videoMediaElement.CurrentState);
            }
            else
                return "";
        }
    }
    // 媒体状态属性
    public string Position
    {
        get
        {
            if (videoMediaElement != null)
            {
                var pos = videoMediaElement.Position;
                var dur = videoMediaElement.Duration;
                // Using a TimeSpan extension method
                return pos.ToShortTimeString() + "/" + dur.ToShortTimeString();
            }
            else
                return "";
        }
    }
    // 音量属性
    public double Volume
    {
        get
        {
            try
            {
                if (videoMediaElement != null)
                {
                    return videoMediaElement.Volume;
                }
                else
                {
                    // You might want to handle the case when videoMediaElement is null.
                    // For now, returning 1 as a default value.
                    return 1;
                }
            }
            catch (NullReferenceException ex)
            {
                // Handle the exception (log, notify, etc.) based on your application's requirements.
                // For now, just log the exception.
                Console.WriteLine($"Error in Volume get: {ex.Message}");
                return 1;
            }
        }
        set
        {
            bool setFlag = false;
            try
            {
                if (videoMediaElement != null && videoMediaElement.Volume != value)
                {
                    videoMediaElement.Volume = value;
                    setFlag = true;
                }
                if (audioMediaElement != null && audioMediaElement.Volume != value)
                {
                    audioMediaElement.Volume = value;
                    setFlag = true;
                }
            }
            catch (NullReferenceException ex)
            {
                // Handle the exception (log, notify, etc.) based on your application's requirements.
                // For now, just log the exception.
                Console.WriteLine($"Error in Volume set: {ex.Message}");
            }

            if (setFlag)
            {
                OnPropertyChanged(nameof(Volume));
            }
        }
    }

    // 构造函数
    public MainPage()
    {
        // 设置数据绑定上下文为当前页面
        BindingContext = this;
        // 初始化页面组件
        InitializeComponent();
    }
    // 播放器位置变化事件
    private void VideoMediaElement_PositionChanged(object sender, MediaPositionChangedEventArgs e)
    {
        OnPropertyChanged(nameof(Position));
    }
    // 播放按钮点击事件
    private void Button_Clicked(object sender, EventArgs e)
    {
      


        if (audioMediaElement.CurrentState == CommunityToolkit.Maui.Core.Primitives.MediaElementState.Playing)
        {
            audioMediaElement.Pause();
            btn.Text = "暂停音乐";
        }

        else if (audioMediaElement.CurrentState == CommunityToolkit.Maui.Core.Primitives.MediaElementState.Paused)
        {
            audioMediaElement.Play();
            btn.Text = "播放音乐";
        }



    }

    // 播放器状态变化事件
    private void VideoMediaElement_StateChanged(object sender, MediaStateChangedEventArgs e)
    {
        OnPropertyChanged(nameof(State));
    }
    // 播放器加载事件
    private void videoMediaElement_Loaded(object sender, EventArgs e)
    {
        videoMediaElement.PositionChanged += VideoMediaElement_PositionChanged;
        videoMediaElement.StateChanged += VideoMediaElement_StateChanged;
        videoMediaElement.MediaOpened += VideoMediaElement_MediaOpened;
        videoMediaElement.MediaEnded += VideoMediaElement_MediaEnded;
        videoMediaElement.MediaFailed  += VideoMediaElement_MediaFailed;
    }
    // 播放器媒体加载失败事件
    private void VideoMediaElement_MediaFailed(object sender, MediaFailedEventArgs e)
    {
        MediaStatus = "媒体失败";
    }

    // 播放器媒体结束事件
    private void VideoMediaElement_MediaEnded(object sender, EventArgs e)
    {
        MediaStatus = "媒体 结束";
    }
    // 播放器媒体打开事件
    private void VideoMediaElement_MediaOpened(object sender, EventArgs e)
    {
        MediaStatus = "媒体 打开";
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/240311.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的事务以及springboot中如何使用事务

事务的四大特性&#xff1a; 概念&#xff1a; 事务 是一组操作的集合&#xff0c;它是不可分割的工作单元。事务会把所有操作作为一个整体&#xff0c;一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 注意&#xff1a; 默认MySQ…

最新UI酒桌喝酒游戏小程序源码,直接上传源码到开发者端即可,带流量主

源码介绍&#xff1a; 2023最新UI酒桌喝酒游戏小程序源码 娱乐小程序源码 带流量主.修改增加了广告位&#xff0c;直接上传源码到开发者端即可。 通过后改广告代码&#xff0c;然后关闭广告展示提交&#xff0c;通过后打开即可。无广告引流。 流量主版本的&#xff08;配合流…

proteus元件合集(一)

LCD LM018L​​ 绿色的LCD寻找方法&#xff1a; 直流电压源 直流电压源寻找方法&#xff1a; 滑动变阻器 滑动变阻器寻找方法&#xff1a; 注意&#xff1a;它出来之后会自动出现那两个红色的。那是电源。

崩坏:星穹铁道【V1.5攻略】五星(金)-遗器主、副词条成长数值参考

星穹铁道中五星遗器词条成长数值攻略&#xff1a; 温馨提示&#xff1a;以下数据会可能会出现一点一点误差&#xff0c;见谅... --------------------------- 一、如图&#xff1a; ----->>细节补充<<----- ①实际数值可能与游戏中不一&#xff0c;若数据出现无法忽…

详解Java中的异常体系结构(throw,throws,try-catch,finally,自定义异常)

目录 一.异常的概念 二.异常的体系结构 三.异常的处理 异常处理思路 LBYL&#xff1a;Look Before You Leap EAFP: Its Easier to Ask Forgiveness than Permission 异常抛出throw 异常的捕获 提醒声明throws try-catch捕获处理 finally的作用 四.自定义异常类 一.异…

深入理解亚信安慧AntDB-T数据库子计划的执行流程

概要&#xff1a; SQL语句在执行时会转换为执行计划&#xff0c;若其中包含了子查询或子链接并且不能被优化&#xff0c;则执行计划会生成子计划&#xff08;查看AntDB的执行计划时看到标记为SubPlan[1] 的部分即为子计划&#xff09;。在整个AntDB数据库中&#xff0c;子计划…

现代C++ 实现单例模式

传统写法有什么问题 如果你了解过单例模式&#xff0c;双重检查锁定模式&#xff08;Double-Checked Locking Pattern&#xff0c;后文简称DCLP&#xff09;的写法你一定不会陌生&#xff0c;甚至你或许认为它是最正确的代码。 class Singleton { public://获取单例Singleton…

MySQL 8.x temp空间不足问题

目录 一、系统环境 二、问题报错 三、问题回顾 四、解决问题 一、系统环境 系统Ubuntu20.04 数据库版本MySQL 8.0.21 二、问题报错 在MySQL上执行一个大的SQL查询报错Error writing file /tmp/MYfd142 (OS errno 28 - No space left on device) Exception in thread …

用C语言实现链队列的基本操作

不多解释&#xff0c;直接上代码&#xff0c;代码已经写了注释&#xff01; //队列链式结构的基本操作&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> typedef int QueueElememtType; typedef struct QNode//链队的定义 {…

什么是蜘蛛池,蜘蛛池是什么蚂蚁SEO

蜘蛛池是一种通过大量模拟真实用户行为来提升网站搜索引擎排名的技术。这种技术利用大量的网络爬虫程序&#xff0c;模拟搜索引擎蜘蛛的爬行行为&#xff0c;通过大量的模拟爬行和页面抓取&#xff0c;提高网站的权重和排名。 如何联系蚂蚁seo&#xff1f; baidu搜索&#xf…

如何查看自己的文章是否被数据库收入?【查收查引】

致谢&#xff1a;特别感谢图书馆的蔡老师&#xff0c;告诉我怎么操作&#xff01; 另外&#xff0c;查收查引报告中的文章可以分开开&#xff0c;放在一起开不是必须的。&#xff08;放在一起开大概是院士工作量需要的。不是很了解。&#xff09; 如何查看自己的文章是否被数据…

杰发科技AC7840——CAN通信简介(1)

简介 7840支持4路CAN-FD Demo调试 官网下载demo&#xff0c;烧录&#xff0c;打开串口发现打印如下。原因是没有连接CAN盒子&#xff0c;总线错误。 CAN收发器端波形 CAN_L有信号&#xff0c;CAN_H没有 波形放大 GPIO端波形 有持续波形输出 波形放大查看&#xff0c;有50U…

.NET 反射优化的经验分享

比如针对 GetCustomAttributes 通过反射获取属性的优化,以下例子 // dotnet run -c Release -f net7.0 --filter "*" --runtimes net7.0 net8.0public class Tests{public object[] GetCustomAttributes() => typeof(C).GetCustomAttributes(typeof(MyAttribute…

如何快速将图片转为excel?

一、打开金鸣表格文字识别软件。 二、点击添加文件按钮&#xff0c;在打开的窗口中选择目标图片&#xff0c;然后点击“打开”&#xff0c;将图片添加进待识别的列表中。 三、点击提交识别或识别全部。 四、识别完成后点击“打开文件”即可打开识别好的结果文件&#xff08;EXC…

Enabling Application Engine Tracing 启用应用程序引擎跟踪

Enabling Application Engine Tracing 启用应用程序引擎跟踪 By default, all Application Engine traces are turned off. To see a trace or a combination of traces, set trace options before you run a program. 默认情况下&#xff0c;所有应用程序引擎跟踪都处于关闭…

Python学习笔记(四):函数的定义、函数的返回值、None类型、函数说明文档、函数的嵌套调用、局部变量、全局变量、global关键字

目录 一、函数介绍 1. 函数是&#xff1a; 2. 使用函数的好处是&#xff1a; 二、函数的定义&#xff1a; 三、函数的参数 1.传入参数的功能是&#xff1a; 2.函数的传入参数 - 传参定义 3.注意事项&#xff1a; 4.练习&#xff1a;测量体温 四、函数的返回值 1.函数…

宇视科技视频监控 main-cgi 文件信息泄露漏洞

宇视科技视频监控 main-cgi 文件信息泄露漏洞 一、产品简介二、漏概述三、复现环境四、漏洞检测手工抓包自动化检测 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#…

【毕业设计】STM32单片机水质PH值电导率TDS超声波水位检测

1、合集资料汇总&#xff08;部分&#xff09; 2、功能 本系统由STM32单片机核心板、超声波测距模块、PH值传感器模块、电导率传感器、LCD1602液晶及电源组成。 1、超声波传感器采集探测距离&#xff0c;PH传感器采集PH值&#xff08;PH传感器需要根据手册校准&#xff09;&a…

阿里云国际版无法远程连接Windows服务器的排查方法

如果您遇到紧急情况&#xff0c;需要尽快登录Windows实例&#xff0c;请参见以下操作步骤&#xff0c;先检查ECS实例的状态&#xff0c;然后通过云助手向Windows实例发送命令或通过VNC登录实例&#xff0c;具体步骤如下&#xff1a; 步骤一&#xff1a;检查ECS实例状态 无论何…

【Delphi】FMX开发 ios 和 android 异同点(踩坑记)

目录 一、前言 二、补充下基础知识 1. APP程序事件&#xff1a;TApplicationEvent 2. APP内置Web服务器或者UDP服务端或者TCP服务端 三、iOS 和 android 平台的不同点 1. TApplicationEvent的不同点&#xff1a;以下不同点&#xff0c;请仔细阅读&#xff01; 2. APP内置…