[MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构

这篇具有很好参考价值的文章主要介绍了[MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这是一篇系列博文。请关注我,学习更多.NET MAUI开发知识!

  • [MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构
  • [MAUI 项目实战] 手势控制音乐播放器(二): 手势交互
  • [MAUI 项目实战] 手势控制音乐播放器(三): 动画
  • [MAUI 项目实战] 手势控制音乐播放器(四):圆形进度条

在之前的博文中提到这个项目,它是为音乐播放器专门开发的基于手势控制的UI界面。

此UI界面可以让用户在不看屏幕的情况下,通过手势来控制音乐播放器的各种操作,如播放、暂停、下一首、上一首。

[MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构
手势来控制的交互方式适合不方便看手机屏幕时简单的音乐播放需求,在驾车、运动等场景下有较好的用户体验。

[MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构

架构

跨平台

使用.NET MAU实现跨平台支持,本项目可运行于Android、iOS平台。

[MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构[MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构

播放内核

播放内核使用MatoMusic.Core,查看此博文[MAUI 项目实战] 音乐播放器(二):播放内核

此项目重点关注的是手势交互UI,播放内核的实现将不再赘述。

手势原理

在播放界面的8个方向,分别放置控制区域,通过拖拽圆形专辑(pan)到控制区域(pit),实现对应的控制操作。此示例实现了快进,快退,下一曲,上一曲,播放/暂停操作,pan和pit将在下一章节介绍。

拖拽平移和控制区域的关系,可以抽象成四个状态,分别是Out,In,Over,Start。

手势状态类型PanType定义如下:

  • In:pan进入pit时触发,
  • Out:pan离开pit时触发,
  • Over:释放pan时触发,
  • Start:pan开始拖拽时触发
public enum PanType
{
    Out, In, Over, Start
}

对拖拽手势的处理,由手势容器控件PanContainer封装,实现方式将在下一章节介绍。

一次有效的控制,经过Start -> In -> Out -> Over的状态变化,并且手指释放位置是在pit的范围内。

当整个控制触发完成后,控件将触发OnfinishedChoise事件。

基本控制

在页面中订阅这个事件,在事件方法中实现控制逻辑。

如上一曲操作,订阅事件后,实现如下逻辑:

private void DefaultPanContainer_OnOnfinishedChoise(object sender, PitGrid e)
{
    CurrentPitView = e;
    switch (CurrentPitView.PitName)
    {
        case "LeftPit":
        MusicRelatedViewModel.PreAction(null);
        break;

        ...
    }
}

控件会将当前触发的pit传递给事件方法,通过pit的名称,可以判断当前触发的是哪个控制区域。

控件在经过pit时会启用广播事件,使用CommunityToolkit库的 WeakReferenceMessenger实现了消息机制,订阅此事件消息可以接收到控件运动的细节,在事件方法中实现自己的逻辑,如界面元素样式的改变。

public NowPlayingPage()
{
    InitializeComponent();
    WeakReferenceMessenger.Default.Register<PanActionArgs, string>(this, TokenHelper.PanAction, PanActionHandler);
    ...
}

如在拖拽开始时,显示控制区域的提示信息,拖拽结束时,隐藏提示信息。

private async void PanActionHandler(object recipient, PanActionArgs args)
{
    var parentAnimation = new Animation();

    Animation scaleUpAnimation1;
    Animation scaleUpAnimation2;
    switch (args.PanType)
    {
        case PanType.Over:

            scaleUpAnimation1 = new Animation(v => this.PitContentLayout.Opacity = v, PitContentLayout.Opacity, 0, Easing.CubicOut);
            scaleUpAnimation2 = new Animation(v => this.TitleLayout.Opacity = v, TitleLayout.Opacity, 1, Easing.CubicOut);

            parentAnimation.Add(0, 1, scaleUpAnimation1);
            parentAnimation.Add(0, 1, scaleUpAnimation2);

            parentAnimation.Commit(this, "RestoreAnimation", 16, 250);
         
...

快进/快退

拖拽停留在左右控制区域超过一定时间,将触发“快进”或“快退”

播放界面拥有一个定时器,用于拖拽快进、快退功能

private IDispatcherTimer _dispatcherTimer;

拖拽进入控制区域时,启动定时器,停留在左右控制区域大于2s时将触发定时器Tick事件,执行快进或快退操作。

private async void PanActionHandler(object recipient, PanActionArgs args)
{

    switch (args.PanType)
    {
        ...
        case PanType.In:

            switch (args.CurrentPit?.PitName)
            {
                case "LeftPit":

                    _dispatcherTimer =Dispatcher.CreateTimer();
                    _dispatcherTimer.Interval=new TimeSpan(0, 0, 2);

                    _dispatcherTimer.Tick+=   async (o, e) =>
                    {
                        this.TipLabel.Text = FaIcons.IconFastBackward;
                        this.TipTextLabel.Text = "快退";
                        _runCount++;
                        await MusicRelatedViewModel.StartFastSeeking(-2);


                    };
                    _dispatcherTimer.Start();
                    this.TipTextLabel.Text = "上一曲";

                    break;
    ...

_runCount是个全局变量,记录是否已经执行过快进或快退操作,当退出控制区域时,如果已经执行过快进或快退操作,将停止快进或快退操作,并将计时器停止。

 case PanType.Out:
    this.PitTipLayout.Children.Clear();
    if (this._runCount > 0)
    {
        MusicRelatedViewModel.EndFastSeeking();
    }
    if (_dispatcherTimer!=null)
    {
        _dispatcherTimer.Stop();

    }
    _runCount = 0;
    this.TipTextLabel.Text = string.Empty;


    break;

同理,在松手时,应该停止快进或快退操作,并将计时器停止。

case PanType.Over:

    ...
    MusicRelatedViewModel.EndFastSeeking();
    if (_dispatcherTimer!=null)
    {
        _dispatcherTimer.Stop();

    }
    _runCount = 0;

沉浸模式

_dispatcherTimer2是控制界面进入“沉浸模式”的定时器,当界面无操作5s之后界面将进入沉浸模式,隐藏标题栏。

private void SetupFullScreenMode(int delay = 5)
{
    _dispatcherTimer2 =Dispatcher.CreateTimer();
    _dispatcherTimer2.Interval=new TimeSpan(0, 0, delay);

    _dispatcherTimer2.Tick+=   (o, e) =>
    {

        this.MainCircleSlider.BorderWidth = 3;
        this.TitleLayout.FadeTo(0);

    };

    _dispatcherTimer2.Start();
}

有操作进行时,恢复到正常模式。

case PanType.Start:

    ...

    if (_dispatcherTimer2.IsRunning)
    {
        _dispatcherTimer2.Stop();
    }
    SetupNormalMode();

    break;

下一章将逐步展开手势控制的实现细节。

项目地址

Github:maui-samples文章来源地址https://www.toymoban.com/news/detail-408807.html

到了这里,关于[MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《微信小程序》音乐播放器项目

    需求:在装有node.js的机器上使用微信开发者工具开发一个音乐播放项目 写这个项目的时候电脑前后蓝屏了5次,制作不易,希望大佬们给个双击,顺子在这感谢啦! 展示: pages–index–index.js 01.png 02.png 02stop.png 03.png 04.png 05.png 06.png banner.jpg banner2.jpg banner3.jpg cover.jpg cover1.png

    2024年02月11日
    浏览(35)
  • 项目7-音乐播放器6+评论区

    前端小白:怎么为你的网页增加评论功能?(一)_为网页添加评论区怎么弄-CSDN博客 参考的上述文章的前端代码 我们从上述前端图片知道,我们数据库需要准备的字段: id,commentuserName,coomentmusicId,comment,time 路径:\\\"/comment/upload\\\" 1.MAPPER 2.SERVICE 3.Controller MAPPER SERVICE CONTROLLER 成功

    2024年04月23日
    浏览(58)
  • 项目7-音乐播放器2(上传音乐+查询音乐+拦截器)

    之后就不用对用户是否登录进行判断了 生效 请求: { post, /music/upload {singer,MultipartFile file}, } 响应: { \\\"status\\\": 0, \\\"message\\\": \\\"上传成功!\\\", \\\"data\\\": true } Java如何判断一个文件是否为真实的MP3文件_判断一个文件是否是mp3 文件-CSDN博客 流程:前端进行相关的文件操作-再将上传的文

    2024年04月17日
    浏览(30)
  • 小项目开发——Android 音乐播放器

    ◼ 音乐播放器 . ◼ 要求 : Activity 编程、 ListView 编程、 SeekBar 编程、 ExoPlayer 编程( 播放 、 暂停 、 停止 、 上一首 、 下一首 ),音乐文件放在 assets/music 目录下,界面自拟. ◼ 期望最终效果: ◼ 分别对应 activity_music_list.xml 、 activity_my_music_player.xml 的视图. ◼ 点击列表任

    2024年01月21日
    浏览(33)
  • 完整实例项目:使用python自制音乐播放器~

    今天使用python的pygame等模块制作了一个简单的音乐播放器,实现了很多好玩的功能,在这里和大家一起分享!这是笔者的第二篇博客,也是正式的完成一个小项目,希望获得大家的支持~ 暂停、继续播放、调整声音大小、上一曲下一曲调整、无限制追加音乐(但需要下载音乐

    2024年02月11日
    浏览(32)
  • 微信小程序仿网易音乐播放器项目

    主页样式 播放页样式 搜索页样式 排行榜页样式 小控件样式 网易云音乐API接口 后端接口,使用node写的,使用了网易云音乐API: 封装的api文件 主页面功能点 banner,滑动菜单栏采用微信的API( swiper 与 scroll-view )进行开发 滑动到底部重新获取后续的歌曲,使用onReachBottom周期

    2024年02月06日
    浏览(27)
  • 基于STM32制作的音乐播放器,用PWM控制蜂鸣器

    目录 效果展示  前言         一、设计背景         1.1、知识储备          二、系统设计方案         2.1、实现功能          2.2、硬件部分         2.3、软件部分          三、软件设计          3.1、设计流程图          3.2、音乐频率的设置          3.3、编

    2024年02月03日
    浏览(62)
  • 开源小项目 - 基于无源蜂鸣器实现的音乐播放器

    目录 一、音乐简谱相关知识 1、音符 2、音调 3、识读简谱 1. 找到简谱中C调的音符对应的蜂鸣器频率(确定音调对应的频率) 2. 确定蜂鸣器演奏一拍所需的时间(即确定一个音调对应的节拍数) 3.创建结构体确定一个音符所需的两个属性(音调频率、节拍数) 4.将《两只老虎

    2024年03月10日
    浏览(38)
  • 【无标题】单片机小项目———音乐播放器(keil+protues)

    刚学完单片机的朋友可以看一看。 主要功能: 1.播放音乐 2.切歌 3.显示歌曲数 仿真:  代码: #includeREG52.H //#define sound_amount 5  sbit play_up=P1^0;        sbit play_down=P1^1;    sbit pause=P1^2;        sbit speaker=P3^1;      unsigned char timer0h,timer0l,time,n; unsigned char music_num;    unsigned int

    2024年02月11日
    浏览(37)
  • 微信小程序做一个圆形图片旋转可以控制开始和结束-音乐播放器的图片旋转功能

    1.在 WXML 文件中添加一个 标签,并设置图片的 src 和样式,并为其绑定一个 animation 用来控制旋转动画。 2.在 WXSS 文件中添加样式,将图片设置为圆形并居中显示。 3.在 JS 文件中定义旋转动画对象和控制方法。 4.在 WXML 文件中添加按钮来触发开始和结束旋转动画。 在以上步骤

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包