鸿蒙音乐播放器(超详细)

基于API9的音乐播放器,可播放,暂停,上,下一首歌曲切换等功能

文章目录

        1.效果展示

        2.首页

        3.播放页


注:需要使用模拟器真机调试运行

一、效果展示

1.首页样式:

2.播放样式:

 

二、首页功能代码

1: UI代码

首页分为2部分,头部和底部。纵向布局,比例1:3。

1.1:头部

//头部Row(){Column(){Image('https://tse2-mm.cn.bing.net/th/id/OIP-C.fNF8owgmIwYhU9KINmt2dAAAAA?w=217&h=217&c=7&r=0&o=5&dpr=1.5&pid=1.7').width(80).height(80).borderRadius(50)Column({space:5}){//获取时间Text(new Date().toDateString()).fontSize(20).fontColor(Color.White).fontWeight(800)Text('1 YEAR ACO TODAY').fontSize(16).opacity(0.6)//透明度}}.width('100%').height('100%').justifyContent(FlexAlign.SpaceAround)}.width('100%').layoutWeight(1).backgroundColor('#4FE3C1').justifyContent(FlexAlign.Center)

1.2:底部

底部使用foreach循环渲染每个歌曲的信息,另外当所需渲染的歌曲过多的时候,我们需要使用Scroll组件,让他歌曲可以滚动以便展示完整歌曲。

//歌单列表Row(){//滚动组件Scroll(){Column({space:20}){//this.songList==》歌曲所有信息,songInfo==》歌曲信息类ForEach(this.songList,(item:songInfo,index:number)=>{//歌曲信息组件Row(){Row({space:10}){Text(item.id.toString()).fontSize(24)//歌曲idImage(item.pic).width(60).height(60)//歌曲图片Column(){//歌曲名称(限定歌曲长度为1行,超出则显示...)Text(item.name).width('60%').fontSize(18).fontWeight(700).maxLines(1).textOverflow({overflow:TextOverflow.Ellipsis })//歌曲作者Text(item.author).fontSize(15).opacity(0.6)}.height(80).alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.SpaceEvenly)}.width('80%')Row(){Text(item.play+'Plays').fontSize(12).fontColor(Color.Gray)//歌曲播放数}.width('20%').height(80).justifyContent(FlexAlign.End).alignItems(VerticalAlign.Bottom)}.width('100%').height(100).borderWidth(1).borderRadius(10).shadow({radius:10}).padding(10)})}.padding({top:20,bottom:20,left:5,right:5})}.scrollBar(BarState.Off).width('100%').height('100%')}.width('100%').layoutWeight(3)

2:其他代码

2.1:首页变量数据

 import { song } from '../mock/song'import { songInfo } from '../model/songInfo'//播放的歌曲信息@StorageLink('song') songList:songInfo[]=[]//播放的歌曲索引@StorageLink('i') currentIndex:number = -1aboutToAppear(){this.songList = song.songList//赋值歌曲信息AppStorage.SetOrCreate('i',-1)//初始化}

2.2:song文件代码

import { songInfo } from '../model/songInfo'
export class song{static songList:songInfo[]=[new songInfo(1,$rawfile('OnlyLovers.png'),'Only Lovers','Trademark',24,541,999,'onlyLovers.mp3'),new songInfo(2,$rawfile('NeverReallyEasy.png'),'Never Really Easy','SSerafim',33,779,999,'NeverReallyEasy.mp3'),new songInfo(3,$rawfile('BumpingUpandDown.png'),'Bumping Upand Down','MCND',40,956,999,'BumpingUpandDown.mp3'),new songInfo(4,$rawfile('BattleField.png'),'Battle Field','JordanFisher',57,978,999,'BattleField.mp3'),new songInfo(5,$rawfile('CanYouFeelIt.png'),'Can You Feel It','JeanRoch',61,988,999,'CanYouFeelIt.mp3'),new songInfo(6,$rawfile('GodIsAGirl.png'),'God Is A Girl','Groove',75,990,999,'GodIsAGirl.mp3'),new songInfo(7,$rawfile('TuViviNell‘aria.png'),'Tu Vivi Nell','Miani',95,999,999,'TuViviNell‘aria.mp3'),]
}

歌曲文件在以下目录中:

 

2.3:songInfo文件代码

export class songInfo{id:number//歌曲idpic:Resource//歌曲图片name:string//歌曲姓名author:string//歌曲作者play:number//播放次数like:number//喜欢总数comment:number//评论数src:string//播放地址constructor(id:number,pic:Resource,name:string,author:string,play:number,like:number,comment:number,src:string) {this.id = idthis.pic = picthis.name = namethis.author = authorthis.play = playthis.like = likethis.comment = commentthis.src = src}
}

 3:点击事件

当用户点击其中任意一首歌曲时,需要跳转到其播放页。由于数据是死的,我们通过传songList中的索引数据过去,就能实现播放对应的歌曲。

代码:

 //歌曲信息组件Row(){......    }.width('100%').height(100).borderWidth(1).borderRadius(10).shadow({radius:10}).padding(10).onClick(()=>{//歌曲信息组件点击事件router.pushUrl({url:'pages/Player'})this.currentIndex = index})

 4:完整代码

import router from '@ohos.router'
import { song } from '../mock/song'
import { songInfo } from '../model/songInfo'
@Entry
@Component
struct Index {//播放的歌曲信息@StorageLink('song') songList:songInfo[]=[]//播放的歌曲索引@StorageLink('i') currentIndex:number = -1aboutToAppear(){this.songList = song.songListAppStorage.SetOrCreate('i',-1)}build() {Column(){//头部Row(){Column(){Image('https://tse2-mm.cn.bing.net/th/id/OIP-C.fNF8owgmIwYhU9KINmt2dAAAAA?w=217&h=217&c=7&r=0&o=5&dpr=1.5&pid=1.7').width(80).height(80).borderRadius(50)Column({space:5}){//获取时间Text(new Date().toDateString()).fontSize(20).fontColor(Color.White).fontWeight(800)Text('1 YEAR ACO TODAY').fontSize(16).opacity(0.6)//透明度}}.width('100%').height('100%').justifyContent(FlexAlign.SpaceAround)}.width('100%').layoutWeight(1).backgroundColor('#4FE3C1').justifyContent(FlexAlign.Center)//歌单列表Row(){//滚动组件Scroll(){Column({space:20}){//this.songList==》歌曲所有信息,songInfo==》歌曲信息类ForEach(this.songList,(item:songInfo,index:number)=>{//歌曲信息组件Row(){Row({space:10}){Text(item.id.toString()).fontSize(24)//歌曲idImage(item.pic).width(60).height(60)//歌曲图片Column(){//歌曲名称(限定歌曲长度为1行,超出则显示...)Text(item.name).width('60%').fontSize(18).fontWeight(700).maxLines(1).textOverflow({overflow:TextOverflow.Ellipsis })//歌曲作者Text(item.author).fontSize(15).opacity(0.6)}.height(80).alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.SpaceEvenly)}.width('80%')Row(){Text(item.play+'Plays').fontSize(12).fontColor(Color.Gray)//歌曲播放数}.width('20%').height(80).justifyContent(FlexAlign.End).alignItems(VerticalAlign.Bottom)}.width('100%').height(100).borderWidth(1).borderRadius(10).shadow({radius:10}).padding(10).onClick(()=>{//歌曲信息组件点击事件router.pushUrl({url:'pages/Player'})this.currentIndex = index})})}.padding({top:20,bottom:20,left:5,right:5})}.scrollBar(BarState.Off).width('100%').height('100%')}.width('100%').layoutWeight(3)}.width('100%').height('100%')}
}

三 、播放功能代码

1:UI代码

1.1:头部

//头部Row(){Column({space:5}){Text(new Date().toDateString()).fontSize(22).fontWeight(800)Text('1 YEAR ACO TODAY').fontSize(15).fontColor(Color.Gray).opacity(0.6)}}.width('100%').layoutWeight(1).justifyContent(FlexAlign.Center)

1.2:空白占位区

//空白占位Row(){}.width('100%').layoutWeight(1)

 1.3:歌曲图片及播放进度

//歌曲图片和播放进度Row(){Stack(){Image(this.songList[this.currentIndex].pic).width(170).height(170).borderRadius(100)Progress({value:this.value,total:this.total,type:ProgressType.Ring}).width(190).height(190).color("#ff49d7b8").style({strokeWidth:8})}}.width('100%').layoutWeight(4).justifyContent(FlexAlign.Center)

 1.4:歌曲信息

//歌曲信息Row(){Column({space:10}){Text(this.songList[this.currentIndex].name).fontSize(25).fontWeight(900)Text(this.songList[this.currentIndex].author).fontSize(18).opacity(0.6)//喜欢,评论,分享Row(){Badge({count:this.songList[this.currentIndex].like,position:BadgePosition.RightTop,style:{badgeSize:20,badgeColor:Color.Red}}){Image($r('app.media.tool_like')).width(40).height(40)}Badge({count:this.songList[this.currentIndex].comment,position:BadgePosition.RightTop,style:{badgeSize:20,badgeColor:Color.Gray}}){Image($r('app.media.tool_comment')).width(40).height(40)}Image($r('app.media.nav_share')).width(40).height(40)}.width('100%').justifyContent(FlexAlign.SpaceAround).margin({top:10})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}.width('100%').layoutWeight(2)

1.5:歌曲菜单控制

 //歌曲菜单Row(){Row(){Image($r('app.media.control_last')).width(50).height(50).onClick(async()=>{})Image(this.isPlaying ? $r('app.media.control_pause') : $r('app.media.control_play')).width(50).height(50).onClick(()=>{this.isPlaying ? this.avPlayer.pause() : this.avPlayer.play()})Image($r('app.media.control_next')).width(50).height(50).onClick(async()=>{})}.width('100%').justifyContent(FlexAlign.SpaceEvenly).margin({top:10})}.width('100%').layoutWeight(1)

2:其他代码(重要)

2.1:播放页变量数据

//歌曲信息@StorageLink('song') songList:songInfo[]=[]//播放的歌曲索引@StorageLink('i') currentIndex:number = -1//现在播放的时间@State value:number = 0//总共播放的时间@State total:number = 0//是否开启定时器标志@State flag:boolean = false//定时器id@State time:number=0//是否正在播放@State isPlaying:boolean = false//音乐播放对象avPlayer:media.AVPlayer

2.2:音乐播放状态及事件

//音乐播放状态setAVPlayerCallback(avPlayer:media.AVPlayer){// error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程avPlayer.on('error', (err) => {console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);avPlayer.reset(); // 调用reset重置资源,触发idle状态})avPlayer.on('stateChange',async(state:string)=>{switch (state){case 'idle': // 成功调用reset接口后触发该状态机上报avPlayer.release(); // 调用release接口销毁实例对象break;case 'initialized': // avplayer 设置播放源后触发该状态上报avPlayer.prepare(); // 调用prepare接口销毁实例对象break;case 'prepared': // prepare调用成功后上报该状态机this.value = avPlayer.currentTime // 播放的时间进度this.total = avPlayer.duration  //  歌曲总共时间avPlayer.play();  // 调用play接口开始播放break;case 'playing':this.isPlaying = true //  开始播放this.flag = true   // 状态标记this.setTimer()   //  启动定时器break;case 'paused':this.isPlaying = false //未开始播放this.deleteTimer()  //暂停定时器avPlayer.pause()  //  调用pause接口暂停播放break;case 'stopped':avPlayer.reset(); // 调用reset接口初始化avplayer状态break;case 'released':break;}})}

 2.3:获取音乐歌曲播放路径

 //获取音乐播放路径async getAVPlayerUrl(){//创建播放实例对象let avPlayer = await media.createAVPlayer()this.setAVPlayerCallback(avPlayer)//获取上下文对象let context = getContext(this) as common.UIAbilityContext//获取播放文件let file = await context.resourceManager.getRawFd(this.songList[this.currentIndex].src)let avFile:media.AVFileDescriptor = {fd:file.fd,offset:file.offset,length:file.length}avPlayer.fdSrc = avFilereturn avPlayer}

 这里的代码不懂的可以参考官网文档,即在我们获取到播放状态时候,添加了处理事件。 

官网链接:使用AVPlayer开发音频播放功能(ArkTS) (openharmony.cn)

2.4:初始化

  async aboutToAppear(){this.avPlayer = await this.getAVPlayerUrl()}

2.5:定时器功能

//定时器(持续增加播放的时间)setTimer(){if(this.flag){this.time = setInterval(()=>{//如果当值大于总的播放时间的时候,那么就取消定时if(this.value++ > this.total){this.deleteTimer()}else {this.value++}},1)}}//取消定时器deleteTimer(){clearInterval(this.time)this.flag = false}//重置时间resetTime(){this.deleteTimer()this.value = 0this.total = 0}

3:点击事件

          //上一首Image($r('app.media.control_last')).width(50).height(50).onClick(async()=>{this.avPlayer.release()if(this.currentIndex-1 < 0){this.currentIndex = this.songList.length -1}else {this.currentIndex--}this.resetTime()this.avPlayer = await this.getAVPlayerUrl()this.avPlayer.play()})//暂停/播放Image(this.isPlaying ? $r('app.media.control_pause') : $r('app.media.control_play')).width(50).height(50).onClick(()=>{this.isPlaying ? this.avPlayer.pause() : this.avPlayer.play()})//下一首Image($r('app.media.control_next')).width(50).height(50).onClick(async()=>{this.avPlayer.release()if(this.currentIndex+1 > song.songList.length){this.currentIndex = 0}else {this.currentIndex++}this.resetTime()this.avPlayer = await this.getAVPlayerUrl()this.avPlayer.play()})

 如果此时播放的歌曲是第一首的情况下,那么当用户点击播放上一首的时候,则播放歌曲列表的最后一首歌曲,播放下一首也是同理。

4:完整代码

import media from '@ohos.multimedia.media'
import { songInfo } from '../model/songInfo'
import common from '@ohos.app.ability.common'
import { song } from '../mock/song'
@Entry
@Component
struct Player {//歌曲信息@StorageLink('song') songList:songInfo[]=[]//播放的歌曲索引@StorageLink('i') currentIndex:number = -1//现在播放的时间@State value:number = 0//总共播放的时间@State total:number = 0//是否开启定时器标志@State flag:boolean = false//定时器id@State time:number=0//是否正在播放@State isPlaying:boolean = false//音乐播放对象avPlayer:media.AVPlayerasync aboutToAppear(){this.avPlayer = await this.getAVPlayerUrl()}//定时器(持续增加播放的时间)setTimer(){if(this.flag){this.time = setInterval(()=>{if(this.value++ > this.total){this.deleteTimer()}else {this.value++}},1)}}//取消定时器deleteTimer(){clearInterval(this.time)this.flag = false}//重置时间resetTime(){this.deleteTimer()this.value = 0this.total = 0}build() {Column(){//头部Row(){Column({space:5}){Text(new Date().toDateString()).fontSize(22).fontWeight(800)Text('1 YEAR ACO TODAY').fontSize(15).fontColor(Color.Gray).opacity(0.6)}}.width('100%').layoutWeight(1).justifyContent(FlexAlign.Center)//空白占位Row(){}.width('100%').layoutWeight(1)//歌曲图片和播放进度Row(){Stack(){Image(this.songList[this.currentIndex].pic).width(170).height(170).borderRadius(100)Progress({value:this.value,total:this.total,type:ProgressType.Ring}).width(190).height(190).color("#ff49d7b8").style({strokeWidth:8})}}.width('100%').layoutWeight(4).justifyContent(FlexAlign.Center)//歌曲信息Row(){Column({space:10}){Text(this.songList[this.currentIndex].name).fontSize(25).fontWeight(900)Text(this.songList[this.currentIndex].author).fontSize(18).opacity(0.6)//喜欢,评论,分享Row(){Badge({count:this.songList[this.currentIndex].like,position:BadgePosition.RightTop,style:{badgeSize:20,badgeColor:Color.Red}}){Image($r('app.media.tool_like')).width(40).height(40)}Badge({count:this.songList[this.currentIndex].comment,position:BadgePosition.RightTop,style:{badgeSize:20,badgeColor:Color.Gray}}){Image($r('app.media.tool_comment')).width(40).height(40)}Image($r('app.media.nav_share')).width(40).height(40)}.width('100%').justifyContent(FlexAlign.SpaceAround).margin({top:10})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}.width('100%').layoutWeight(2)//歌曲菜单Row(){Row(){//上一首Image($r('app.media.control_last')).width(50).height(50).onClick(async()=>{this.avPlayer.release()if(this.currentIndex-1 < 0){this.currentIndex = this.songList.length -1}else {this.currentIndex--}this.resetTime()this.avPlayer = await this.getAVPlayerUrl()this.avPlayer.play()})//暂停/播放Image(this.isPlaying ? $r('app.media.control_pause') : $r('app.media.control_play')).width(50).height(50).onClick(()=>{this.isPlaying ? this.avPlayer.pause() : this.avPlayer.play()})//下一首Image($r('app.media.control_next')).width(50).height(50).onClick(async()=>{this.avPlayer.release()if(this.currentIndex+1 > song.songList.length){this.currentIndex = 0}else {this.currentIndex++}this.resetTime()this.avPlayer = await this.getAVPlayerUrl()this.avPlayer.play()})}.width('100%').justifyContent(FlexAlign.SpaceEvenly).margin({top:10})}.width('100%').layoutWeight(1)//占位Row(){}.width('100%').layoutWeight(1).backgroundColor("#ff49d7b8")}.width('100%').height('100%')}//音乐播放状态setAVPlayerCallback(avPlayer:media.AVPlayer){// error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程avPlayer.on('error', (err) => {console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);avPlayer.reset(); // 调用reset重置资源,触发idle状态})avPlayer.on('stateChange',async(state:string)=>{switch (state){case 'idle': // 成功调用reset接口后触发该状态机上报avPlayer.release(); // 调用release接口销毁实例对象break;case 'initialized': // avplayer 设置播放源后触发该状态上报avPlayer.prepare(); // 调用prepare接口销毁实例对象break;case 'prepared': // prepare调用成功后上报该状态机this.value = avPlayer.currentTime // 播放的时间进度this.total = avPlayer.duration  //  歌曲总共时间avPlayer.play();  // 调用play接口开始播放break;case 'playing':this.isPlaying = true //  开始播放this.flag = true   // 状态标记this.setTimer()   //  启动定时器break;case 'paused':this.isPlaying = false //未开始播放this.deleteTimer()  //暂停定时器avPlayer.pause()  //  调用pause接口暂停播放break;case 'stopped':avPlayer.reset(); // 调用reset接口初始化avplayer状态break;case 'released':break;}})}//获取音乐播放路径async getAVPlayerUrl(){//创建播放实例对象let avPlayer = await media.createAVPlayer()this.setAVPlayerCallback(avPlayer)//获取上下文对象let context = getContext(this) as common.UIAbilityContext//获取播放文件let file = await context.resourceManager.getRawFd(this.songList[this.currentIndex].src)let avFile:media.AVFileDescriptor = {fd:file.fd,offset:file.offset,length:file.length}avPlayer.fdSrc = avFilereturn avPlayer}
}

总结

利用AVPlayer开发音频播放,重点是掌握如何获取播放路径(本地地址,网络地址)等,再根据歌曲的状态编写对应函数即可。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于SQL数据库的酒店管理系统

一、数据库设计 1&#xff0e;需求分析 客房的预定&#xff1a;可以通过网络进行预定&#xff0c;预定修改&#xff0c;取消预订。 客房管理&#xff1a;预定管理、客房查询、设置房态、开房、换房、续住、退房等管理。 员工管理: 员工修改信息、人员调配。 账务管理&…

绿色智能:AI机器学习在环境保护中的深度应用与实践案例

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

2.vue常用指令

2.vue常用指令 目录 1. vue的基础语法结构2. 插值语法3. vue常用指令 3.1 v-html语法结构3.2 v-text3.3 v-bind 绑定动态属性3.4 v-on 添加事件 语法格式3.4.1事件绑定3.4.2 获取event对象3.4.3 动态事件缩写3.4.5 事件绑定的修饰符 3.5 v-if v-else-if v-else5.6 v-show5.7 …

《Solana 中文开发教程》学习笔记(Part 1~4)

Part 1 &#xff1a;Solana介绍 2017年11月&#xff0c;Anatoly Yakovenko发表了一篇白皮书&#xff0c;介绍了“Proof of History”这一技术 Part 2 &#xff1a;Solana介绍 Account 在Solana中&#xff0c;"Everythin is an Account" 类似Linux世界里面把所有的…

基于触觉感知的目标识别技术在智能机器人抓取中的应用综述

引言在智能机器人抓取任务中&#xff0c;目标识别是一个核心问题。机器人不仅需要识别物体&#xff0c;还需根据物体的形状、纹理、硬度等信息来规划抓取策略。传统的目标识别方法通常依赖于视觉信息&#xff0c;但在许多复杂环境中&#xff0c;单一视觉信息往往不能提供足够的…

huggingface 中模型如何查找和使用?

在 Models - Hugging Face模型中找使用方法 https://hf-mirror.com/ 一&#xff1a;如何找到统一使用方法 对于文字处理AutoTokenizer是一样的&#xff0c;模型名可能不一样。具体操作如下&#xff1a; 1. 先在模型下面找到你需要的模型点开 2. 点开最右边的Use in Transfor…

AgentLego:组装大模型智能体“乐高”

1 AgentLego 1.1 AgentLego 是什么 AgentLego 是一个提供了多种开源工具 API 的多模态工具包&#xff0c;旨在像是乐高积木一样&#xff0c;让用户可以快速简便地拓展自定义工具&#xff0c;从而组装出自己的智能体。通过 AgentLego 算法库&#xff0c;不仅可以直接使用多种工…

w071基于springboot的图书进销存管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

手撕单例的 5 种写法!

单例模式是一种常见的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。当然&#xff0c;它也是面试中的常客&#xff0c;尤其是某手面试中经常要求应聘者手撕&#xff0c;所以今天咱们就来盘盘它。 单例模式的实现方式有很多&…

制作Windows11个人iso镜像的方法

一、前期准备 1.光盘刻录软件AnyBurn 2.对应Windows11版本的iso基础镜像&#xff08;一定要对应&#xff0c;不然封装的iso镜像无法使用&#xff09; Windows11最新版本24H2的iso镜像下载地址下载 Windows 11 此前版本下载地址官方网站不再提供&#xff0c;需要自行搜索下载 笔…

timesnet+timemixer时间序列预测模型

1.timesnet 原论文源码&#xff1a;https://github.com/thuml/Time-Series-Library?tabreadme-ov-file 时间序列分析被广泛应用于众多领域中&#xff0c;如天气预报中预测气象要素的未来变化、数据质控时填补缺失值、工业生产中监控设备状态、医疗诊断时分析心跳曲线等。 不…

Linux 35.6 + JetPack v5.1.4之RTP实时视频Python框架

Linux 35.6 JetPack v5.1.4之RTP实时视频Python框架 1. 源由2. 思路3. 方法论3.1 扩展思考 - 慎谋而后定3.2 扩展思考 - 拒绝拖延或犹豫3.3 扩展思考 - 哲学思考3.4 逻辑实操 - 方法论 4 准备5. 分析5.1 gst-launch-1.05.1.1 xvimagesink5.1.2 nv3dsink5.1.3 nv3dsink sync05…

异或和公式

前缀异或和公式 前缀异或和的概念与前缀和类似&#xff0c;但它使用的是异或&#xff08;XOR&#xff09;操作而不是加法。异或操作有一些独特的性质&#xff0c;使得前缀异或和在处理某些问题时非常有用。下面是前缀异或和的推导原理&#xff1a; • 异或操作的性质&#xf…

【Unity】 HTFramework框架(五十三)使用 Addressables 可寻址系统

更新日期&#xff1a;2024年7月25日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 Addressables 可寻址系统使用 Addressables 可寻址系统一、导入 Addressables二、切换到 Addressables 加载模式三、切换资源加载助手四、加载资源五、注…

Spring Cache简单使用

Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能。只需要简单地加一个注解&#xff0c;就能实现缓存功能 Spring Cache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; 1.EHCahce 2.Chffeine 3.Redis 需要导入的maven坐标 …

Delphi Web前端开发教程(9):基于TMS WEB Core框架

3、REST Servers服务端(后端)框架 REST服务端特点&#xff1a; – 为远程资源提供一个REST API接口。也可以为其他网络内容提供服务&#xff1b; – 包括在Delphi Enterprise & Architect企业版和架构师版中的RAD服务器、DataSnap、WebBroker&#xff1b; – 开源框架&a…

vue+mars3d点击图层展示炫酷的popup弹窗

展示效果 目录 一&#xff1a;叠加数据图层到地图上&#xff0c;此时需要使用bindPopup绑定popup 二、封装自定义的popup&#xff0c;样式可以自行调整 一&#xff1a;叠加数据图层到地图上&#xff0c;此时需要使用bindPopup绑定popup 这里我根据数据不同&#xff0c;展示的…

【机器人学】3-1.六自由度机器人速度域-雅克比矩阵【附MATLAB代码】

MATLAB仿真验证 已知六轴机器人的D-H参数如下所示&#xff1a; 关节1关节2关节3关节4关节5关节609000-9090a0042539300d160.700113.39993.60900-9000000000 通过D-H参数&#xff0c;选用改进型的D-H参数&#xff0c;可以得到各个关节间的旋转矩阵。详细请看我的第一篇博客六自…

基于SSM的网上拍卖系统+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、卖家、买家功能模块&#xff1a;用户管理、卖家管理、公告管理、竞拍物品管理、预约竞拍管理、竞拍管理等技术选型&#xff1a;SSM&#xff0c;jsp等测试环境&#xff1a;idea2024&#xff0c;jdk1.8&#xff0c;tomcat8&#xff0c;n…

Vue3安装 运行教程

本文是综合了所有vue安装教程而成 更细化 更简略 希望对各位读者有所帮助&#xff01; Vue安装 1. Vue-cli脚手架安装 安装vue的方式有很多 我们这里选择npm方式安装vue npm方式 npm方式安装vue&#xff0c;详细介绍见下文。 1.node.js安装和配置 安装npm 需要安装note.js&…