Android音乐播放器中的歌词同步学习分析

android歌词同步 最近做了一个android的音乐播放器,下面将介绍歌词同步显示的实现。网上关于这一块的参考实例,多数人推荐了Yoyoplayer。YOYOPlayer是一个用JAVA编写的,跨平台的音乐播放软件.集播放,歌词显示于一体,并且开放源代码,感兴趣的朋友可以自行google。 一、LRC歌词文件的解析         先要了解LRC文件的格式,可以参考:http://baike.baidu.co 阅读详情

在网上查了一下资料,感谢 http://www.cr173.com/html/20184_1.html 给了我思路,可以说他提供了最基本的歌词同步的功能,我在其上面添加了自己的修改的代码。

主要是自己为了实现歌词同步,并且通过移动seekbar,改变歌曲的歌词位置。当然还有自己不一样的地方。

首先歌词播放,是要一个子线程来操作,这个子线程负责在找到两段歌词之间的时间差,然后显示当前正在播放的歌词。

1

歌词部分

1.歌词的格式为.lrc 这是有一定格式的,最重要的是[MM:ss,mm]

以白玫瑰.lrc歌词为例


需要对歌词进行解析,歌词的实体类。

MyLrc.java

public class MyLrc implements Comparable<Object>{
	private int time;
	private String lyric;
	public int getTime() {
		return time;
	}
	public void setTime(int time) {
		this.time = time;
	}
	public String getLyric() {
		return lyric;
	}
	public void setLyric(String lyric) {
		this.lyric = lyric;
	}
	//放在set集合中可以看下面要求进行排序
	@Override
	public int compareTo(Object arg0) {
		int later=0;
		if(arg0 instanceof MyLrc)
		{
			later=((MyLrc)arg0).getTime();
		}
		return this.time-later;
	}
	@Override
	public String toString() {
		return this.time+""+this.lyric;
	}
	
}

 实现comparaTo的方法的目的是在把对象放入TreeSet中的时候,按照歌词时间的循序放入,方便之后拿出来。比较使用(我觉得这部很重要,因为后期需要判断拉动SeekBar的时候找到对应的时间的位置)

LrcUtil.java

//对歌词进行解析
public class LrcUtil {

	private static TreeSet<MyLrc> tree;

	// 将对应的lrc文件转化为treeMap,分别对应的时间以及歌词
	public LrcUtil(InputStream musicTitle) {
		TreeSet<MyLrc> treeset = new TreeSet<MyLrc>();
		// 用来存放歌曲的时间和对应的歌词
		InputStreamReader inReader = null;
		BufferedReader reader = null;
		try {
			inReader = new InputStreamReader(musicTitle);
			reader = new BufferedReader(inReader);
			String line = "";
			while ((line = reader.readLine()) != null) {
				// 对那行歌词进行分割,判断,然后存储
				String[] substr = line.split("\\]");
				for (String ss : substr) {
					if (ss.contains("[") && ss.contains(":")
							&& ss.contains(".")) {
						String sss = ss.replaceAll("\\[", "");
						String[] timeStart = sss.split(":");
						String[] timeEnd = timeStart[1].split("\\.");
						// 计算出当前的时间的毫秒数
						int time = (Integer.valueOf(timeStart[0]) * 60 + Integer
								.valueOf(timeEnd[0]))
								* 1000
								+ Integer.valueOf(timeEnd[1]) * 10;
						// 对应的时间放一个对应的歌词
						MyLrc lrc = new MyLrc();
						lrc.setTime(time);
						lrc.setLyric(substr[substr.length - 1]);
						treeset.add(lrc);
					}
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				inReader.close();
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		tree = treeset;
	}
	//获得lrc文件的歌词点的列表
	public List<String> getWords() {
		List<String> list = new ArrayList<String>();
		Iterator<MyLrc> it = tree.iterator();
		while (it.hasNext()) {
			MyLrc my = it.next();
			list.add(my.getLyric());
		}
		return list;
	}
    //获得lrc文件的时间点的列表
	public List<Integer> getTimes() {
		List<Integer> list = new ArrayList<Integer>();
		Iterator<MyLrc> it = tree.iterator();
		while (it.hasNext()) {
			MyLrc my = it.next();
			list.add(my.getTime());
		}
		return list;
	}
}

Lrc工具类在构造方法中传入一个InputStream流,由于现在是本地测试,所以本地先放入lrc文件。Android中可以把歌词文件放在Assets文件中,但是有些歌是中文的,而Assets文件中是不允许放中文的文件的

显示为非法名字,所以我打算把中文歌曲的名字转化为拼音再查找。

Activity中歌词显示的代码

根据当前歌曲的进度启一个子线程,sleep一段时间,其他时间刷新控件显示。

private void initLrcThread(int currentPosition) {
		LrcUtil lrcUtil = null;
		try {
			lrcUtil = new LrcUtil(getAssets().open(Trans2PinYin.trans2PinYin(currentMusic.getTitle())+".lrc"));
			playing_text_lrc.init(Trans2PinYin.trans2PinYin(currentMusic.getTitle())+".lrc");
		} catch (IOException e) {
			ToastInfo(R.string.notfind_lrc);
		}
		if(lrcUtil==null)
			return;
		final List<Integer> lrctime = lrcUtil.getTimes();
		if(currentPosition>lrctime.get(lrctime.size()-1))
			return;
		int position = 0;
		for (int i = 0; i < lrctime.size()-1; i++) {
			if (currentPosition < lrctime.get(0)) {
				position = 0;
				break;
			} else if (currentPosition > lrctime.get(i)
					&& currentPosition < lrctime.get(i + 1)) {
				position = i;
				break;
			}
		}
		final int p = position;
		//找到对应位置的歌词
		playing_text_lrc.changeIndex(p);
		// 起一个子线程进行歌词显示
		new Thread() {
			int i = p;

			public void run() {
				while (!mService.isPause()) {
					handler.post(new Runnable() {
						@Override
						public void run() {
							playing_text_lrc.invalidate();
						}
					});
					try {
						if (i == 0)
							Thread.sleep(lrctime.get(i));
						else {
							Thread.sleep(lrctime.get(i + 1) - lrctime.get(i));
						}
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					i++;
					//防止下标越界!
					if (i+1 >= lrctime.size())
						break;
				}
				;
			}
		}.start();
		
	}


这里是对自定义控件显示歌词的操作,如果没找到对应的lrc就打的Toast即可。

对于歌曲显示的子线程。当歌曲在播放的时候。线程sleep一段时间后对自定义的歌词控件进行刷新。每次刷新都会走空间中的ondraw的方法。

在ondraw方法中,刷新一次就跳到下一个歌词。

当然了,这里通过SeekBar移动的时候可以得到当前歌曲的位置(时间点),通过这个时间点(currentPosition)找到对应的getTimes列表中的歌词的位置

<span style="white-space:pre">	</span>for (int i = 0; i < lrctime.size()-1; i++) {
<span style="white-space:pre">				</span>if (currentPosition < lrctime.get(0)) {
<span style="white-space:pre">				</span>position = 0;
<span style="white-space:pre">				</span>break;
<span style="white-space:pre">				</span>} else if (currentPosition > lrctime.get(i)
<span style="white-space:pre">						</span>&& currentPosition < lrctime.get(i + 1)) {
<span style="white-space:pre">					</span>position = i;
<span style="white-space:pre">					</span>break;
<span style="white-space:pre">				</span>}
<span style="white-space:pre">	</span>}
并且同时改变
playing_text_lrc.changeIndex(p);


LRCTextView.java

public class LRCTextView extends TextView {
	private List<String> mWordsList = new ArrayList<String>();
	private Paint mLoseFocusPaint;
	private Paint mOnFocusePaint;
	private float mX = 0;
	private float mMiddleY = 0;
	private float mY = 0;
	private static final int DY = 50;
	private int mIndex = 0;
	private Context context;

	public LRCTextView(Context context) throws IOException {
		super(context);
		this.context = context;
	}

	public LRCTextView(Context context, AttributeSet attrs) throws IOException {
		super(context, attrs);
		this.context = context;
	}

	public LRCTextView(Context context, AttributeSet attrs, int defStyle)
			throws IOException {
		super(context, attrs, defStyle);
		this.context = context;
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		Paint p = mLoseFocusPaint;
		// 未走到init未找到歌词
		if (p == null) {
			p=new Paint();
			p.setTextSize(50);
			canvas.drawText("未找到歌词", mX-100, mMiddleY, p);
			return;
		}
		p.setTextAlign(Paint.Align.CENTER);
		Paint p2 = mOnFocusePaint;
		p2.setTextAlign(Paint.Align.CENTER);
		// 防止下表越界
		if (mIndex >= mWordsList.size())
			return;
		canvas.drawText(mWordsList.get(mIndex), mX, mMiddleY, p2);

		int alphaValue = 25;
		float tempY = mMiddleY;
		for (int i = mIndex - 1; i >= 0; i--) {
			tempY -= DY;
			if (tempY < 0) {
				break;
			}
			p.setColor(Color.argb(255 - alphaValue, 245, 245, 245));
			canvas.drawText(mWordsList.get(i), mX, tempY, p);
			alphaValue += 25;
		}
		alphaValue = 25;
		tempY = mMiddleY;
		for (int i = mIndex + 1, len = mWordsList.size(); i < len; i++) {
			tempY += DY;
			if (tempY > mY) {
				break;
			}
			p.setColor(Color.argb(255 - alphaValue, 245, 245, 245));
			canvas.drawText(mWordsList.get(i), mX, tempY, p);
			alphaValue += 25;
		}
		mIndex++;
	}

	@Override
	protected void onSizeChanged(int w, int h, int ow, int oh) {
		super.onSizeChanged(w, h, ow, oh);

		mX = w * 0.5f;
		mY = h;
		mMiddleY = h * 0.3f;
	}

	public void init(String musicName) throws IOException {
		setFocusable(true);

		LrcUtil lrcHandler = new LrcUtil(context.getAssets().open(musicName));
		mWordsList = lrcHandler.getWords();

		mLoseFocusPaint = new Paint();
		mLoseFocusPaint.setAntiAlias(true);
		mLoseFocusPaint.setTextSize(30);
		mLoseFocusPaint.setColor(Color.BLACK);
		mLoseFocusPaint.setTypeface(Typeface.SERIF);

		mOnFocusePaint = new Paint();
		mOnFocusePaint.setAntiAlias(true);
		mOnFocusePaint.setColor(Color.RED);
		mOnFocusePaint.setTextSize(50);
		mOnFocusePaint.setTypeface(Typeface.SANS_SERIF);
	}

	public void changeIndex(int i) {
		mIndex = i;
	}
这里我稍微修改了这个方法,传入一个changeIndex用于Seekbar被拉动时候,歌词的改变。其他的与http://www.cr173.com/html/20184_1.html相似

而在每次歌曲切换或者进度条移动的时候调用这个方法即可

initLrcThread(currentPosition);

这里用到了

Trans2PinYin.trans2PinYin(currentMusic.getTitle()

这个方法,这是中文转化为拼音的方法。百度即可。











深入理解Android音视频同步机制(一)概述 音视频同步,即avsync,是影响多媒体应用体验质量的一个重要因素。 本系列文章将从四个角度来深入研究Android平台上的音视频同步机制,以求为遇到音视频不同步问题的朋友提供一个思路: 阅读详情

相关推荐

Android MP3音乐播放器实现歌词同步滚动显示项目

标准LRC文件遵循一定的语法规则,主要包括两类标签:时间标签和元数据标签。时间标签形如[mm:ss.xx]或[mm:ss],表示该行歌词应在此时刻显示。例如:[01:30.50]这是第一句歌词元数据标签通常出现在文件开头,以[id:xxx]的形式存在,用于描述歌曲相关信息。常见标签如下:标签含义示例歌手名称[ar:周杰伦][ti:Title]歌曲标题[ti:七里香][al:Album]所属专辑[al:十一月的萧邦]

weixin_42579969的博客 1274

Java播放歌词同步源码,Android 实现歌词同步

歌词同步的原理其实很简单:歌词显示是一个线程, 音乐播放时一个线程,通过播放时间将歌词显示进度与播放进度同步起来。网络标准的歌词格式是LRC。 我们看下一个LRC文档,其格式就一目了然了。[ti:爱][ar:小虎队][al:华纳国语情浓13首][by:爱上你了音乐网][02:08.00][00:38.00]把你的心、我的心串一串[02:11.00][00:41.00]串一株幸运草、串一?同心圆[0...

weixin_36219842的博客 634

Android音乐播放器LRC歌词同步开发实战

在本章中,我们详细解析了LRC时间戳的语法结构,介绍了毫秒级精度的处理方式,并探讨了多时间戳共存时的处理逻辑。接着,我们分析了歌词内容与播放时间之间的映射关系,并设计了容错机制以提高匹配的稳定性。最后,通过Java/Kotlin语言,展示了如何构建歌词对象模型,并将解析结果存储为有序结构。这些内容为后续章节中歌词解析器的实现奠定了坚实基础。我们可以定义一个LyricLine类来封装每句歌词的时间戳和文本内容。val timestamp: Long, // 时间戳(毫秒)

weixin_30838971的博客 1143

android的歌词播放,android手机音乐播放器实现歌词同步

360听 手机音乐播放器1.2 S60官方安装版类型:塞班平台应用大小:1.2M语言:中文 评分:4.0标签:立即下载最近在做一款android手机上的音乐播放器,学习到了很多东西,像是Fragment,ActionBar的使用等等,这里就先介绍一下歌词同步的实现问题。歌词同步的实现思路很简单:获取歌词文件LRC中的时间和歌词内容,然后在指定的时间内播放相应的内容。获取不难,难就在于如何在手机屏幕...

weixin_36302331的博客 885

Android音乐播放器歌词显示与颜色动画实现指南

音乐播放器的核心组件通常包括用户界面(UI)、音频引擎、播放列表和控制器等。用户界面负责与用户交互,显示播放进度、歌曲信息等;音频引擎负责音频的解码和播放;播放列表管理播放曲目的顺序和选择;控制器则接收用户的操作指令,如播放、暂停等,然后通过调用音频引擎的接口来控制音乐播放。

weixin_33240461的博客 1053

Android自定义LrcView歌词同步控件开发实战

LrcView是专为Android平台设计的自定义歌词展示控件,具备高度可定制性和良好的性能表现。它能够与音乐播放器无缝集成,实现实时歌词同步显示功能,从而增强用户的听歌体验。本章将重点介绍LrcView的核心功能,包括歌词的自动滚动高亮当前行根据播放进度定位歌词位置等关键特性,并深入解析其背后的基本工作原理。通过本章学习,开发者将对LrcView在播放器界面中的作用和设计目标有全面理解,为后续开发与优化打下基础。// 构造函数、getter、setter略。

weixin_34064233的博客 968

Android中音乐播放器实现歌词同步显示

歌词同步的原理其实很简单:  歌词显示是一个线程, 音乐播放时一个线程,通过播放时间将歌词显示进度与播放进度同步起来。  网络标准的歌词格式是LRC。 我们看下一个LRC文档,其格式就一目了然了。  [ti:爱]  [ar:小虎队]  [al:华纳国语情浓13首]  [by:爱上你了音乐网]  [02:08.00][00:38.00]把你的心、我的心串一串  [02:11.00][00:...

dilianzhuo1928的博客 876

Android平台LRC歌词显示应用Demo

LRC是一种广泛使用的歌词文件格式,其特点是将歌词文本与时间戳相结合,使得歌词能够与音乐同步显示。这种格式简单易懂,被多数音乐播放器支持,便于歌词内容的共享与编辑。时间戳是描述歌词同步信息的关键部分,通常表示为“[mm:ss.fff]”,其中“mm”代表分钟,“ss”代表秒,“fff”代表毫秒。在解析LRC歌词文件时,时间戳通常出现在歌词文本的左侧,并用方括号包围,例如:上述例子中“00:01.234”就是时间戳,表示在音频播放到1秒234毫秒时,应显示文本“Hello, World!

weixin_33812391的博客 1308

蓝牙音乐之歌词同步

蓝牙音乐之歌词同步 旋律成就经典,歌词升华曲目,歌词作为最能体现一首歌曲深度的点,蓝牙音乐必然也少不了,本期分享就和大家聊聊蓝牙音乐歌词同步的故事。 蓝牙音乐歌词都是从TG端(手机)的音乐播放器通过蓝牙技术传输到CT端的,因此保证音乐播放器打开该功能才能正确传输歌词。日常生活中常见的的几大音乐播放器的设置中都有该功能开关。 常见的获取歌曲信息的AVRCP指令就如下两条,详情参考《蓝牙音乐之AVRCP常用指令介绍》。 AVRCP Get Element Attributes(控制通道) AVRCP Get

坏小子-无线通信技术 7765

实现音乐播放器悬浮歌词功能的Android源码

虽然互联网上存在大量现成的LRC歌词资源,但用户有时也需要自定义歌词。允许用户上传自己的LRC文件,为音乐添加个性化的歌词,是提高用户满意度的重要方式。软件应当提供一个简单的上传和编辑界面,确保用户可以轻松地修改和保存他们自己的歌词文件。graph LRA[开始] --> B[检测音乐库更改]B --> C{LRC文件是否存在}C -->|不存在| D[提示用户上传LRC]C -->|存在| E[比较文件时间戳]E --> F{时间戳是否一致}F -->|不一致| G[提示用户更新LRC]

weixin_42527589的博客 1086

com.mylrc.mymusic.apk

很好的音乐播放器,用了很多这个比较方便舒服。界面设设计也很用心,无病毒可以放心使用

android 音乐播放器-------歌词同步 lrc

lrc格式 :[al:这首歌所在的唱片集 ] [ar:歌词作者 ] [by:本LRC文件的创建者 ] [offset:+/- 以毫秒为单位整体时间戳调整,+增加,-减小 ] [re:创建此LRC文件的播放器或编辑器 ] [ti:歌词(歌曲)的标题 ] [ve:程序的版本 ]时间标记的格式为[mm:ss.xx] 其中mm 为分钟数,ss 为秒数并且xx 为百分之一秒例子:[ti:爱][ar:小虎队][al:华纳国语情浓13首][by:爱上你了音乐网]百度百科关于lrc的解释

dany1202的专栏 2万+

android-lrc-view_android源码_

Android through a custom View to implement the parsing lyrics LRC England and synchronous rolling

Android开源音乐播放器之自动滚动歌词

系列文章 Android开源在线音乐播放器——波尼音乐 Android开源音乐播放器之播放器基本功能 Android开源音乐播放器之高仿云音乐黑胶唱片 Android开源音乐播放器之自动滚动歌词 Android开源音乐播放器之在线音乐列表自动加载更多 前言 上一节我们仿照云音乐实现了黑胶唱片专辑封面,这节我们该实现歌词显示了。当然,歌词不仅仅是显示就完了,作为一个有素质的音乐播放器,我们当然还...

weixin_34220834的博客 1288

告别ROS1思维:在ROS2 Humble上,用Python搞定MoveIt2机械臂控制的完整流程

本文详细介绍了在ROS2 Humble环境下使用Python控制MoveIt2机械臂的完整流程。从环境配置、架构变革到实战操作,涵盖URDF适配、Action接口编程及性能优化技巧,帮助开发者高效迁移ROS1项目至ROS2平台,实现工业级机械臂控制。

weixin_30352645的博客 449

工业视觉开发者的福音:用C#玩转VisionMaster算子(非方案版完整教程)

本文为工业视觉开发者提供了一份完整的C#与VisionMaster算子二次开发教程,详细介绍了环境配置、算子调用原理、性能优化技巧及实战案例。通过模板匹配和二维码识别等实例,展示了如何高效集成VisionMaster算子到现有框架中,提升工业自动化视觉检测系统的灵活性和性能。

weixin_29280657的博客 270

基于android音乐播放器的设计

本科毕业论文(设计)诚信声明本人郑重声明:所呈交的毕业论文(设计),题目《………基于android音乐播放器的设计……………………………》是本人在指导教师的指导下,进行研究工作所取得的成果。对本文的研究作出重要贡献的个人和集体,均已在文章以明确方式注明。除此之外,本论文(设计)不包含任何其他个人或集体已经发表或撰写过的作品成果。本人完全意识到本声明应承担的责任。摘 要本文说明了制作音乐播放器所用的技术,制作流程和功能介绍。Android是一个开源的系统,它底层是基于Linux的操作系统,本论文的音乐播放器采

科大云炬 4267

Calibre提参实战:如何用hcell和xcell文件精准屏蔽模块(附避坑指南)

本文详细解析了Calibre提参过程中hcell和xcell文件的应用技巧,帮助工程师精准屏蔽模块以优化寄生参数提取。通过对比hcell与xcell的核心差异、图形界面与命令行操作指南,以及常见问题排查方法,提升芯片后端设计效率。附避坑指南,解决EETOP论坛热议的模块丢失问题。

weixin_26795617的博客 438

android 歌词同步 换行,HTML5音乐播放器同步显示歌词

歌词文件的格式实现之前,当然得了解一下歌词文件的格式了。常规歌词文件的格式基本是一句一行,每行由两部分组成,前面是中括号括起来的时间轴,后面紧跟歌词,像下面这样:[ti:记兰生襄铃][ar:HITA][al:在线热搜(华语)系列30][offset:0][00:05.91]记兰生襄铃[00:07.54]填词:三日月[00:09.41]原曲:夏川里美[00:11.48]演唱:HITA肉肉[00:1...

weixin_42187487的博客 469

光学系统设计:波段、光源、光纤与探测器匹配指南

在光学测量和光纤通信系统中,波段、光源、光纤和探测器的匹配关系是系统设计的核心基础。波段指电磁波谱中的特定波长范围,光源负责产生特定波长的光信号,光纤作为传输介质需要与波长匹配以降低损耗,探测器则负责将光信号转换为电信号。理解各组件的光谱特性对于系统性能至关重要,例如在850nm短波长多模光纤系统中,VCSEL激光器与PIN光电二极管的组合能提供最佳性价比。典型应用场景包括生物医学成像、光纤通信和气体传感,其中光谱重叠优化、模场直径匹配和偏振特性协调是关键技术要点。通过实测数据对比不同组合的传输性能,可以为

weixin_33812433的博客 338

智能车图像处理9-进阶篇1--中线的提取

(1)10-50行 基础扫线 (2)56-71 断行0 ,就是比如遇到十字,十字路口下方 第一次断线的地方。 (3)83-124 按照原先有效行,拟线作为中值,然后从中值向左右扫线,同时计算赛道宽度。 (4)125-138 如果出现赛道宽度小于先前有效行,则找到二次扫线的起点,从二次扫线起点处,继续向下扫线,直至结束,同时记录最后的有效行。 (5) 310-- 最后计算左右边线类似于方差的值,用于环岛的判断 ***这里着重描述一下二次扫线,希望大家可以理解的深刻

taiyuezyh的博客 1万+

探索APlayer:您的安卓本地音乐播放器新选择

在数字音乐时代,拥有一款功能全面、操作简便的音乐播放器至关重要。今天,我们要向您推荐的是一款名为APlayer的安卓本地音乐播放器,它以其简洁的界面、强大的功能和高度定制化的特点,正逐渐成为音乐爱好者的首选。 ## 项目介绍 APlayer是一款专为安卓用户设计的本地音乐播放器,它不仅提供了基础的音乐播放功能,还集成了多种高级特性,如自动封面补全、在线歌词显示、桌面歌词和部件支持等。这款播放器...

gitblog_00384的博客 1236

Claude Code Cli 源码泄露事件全解析:从51万行代码中拆解AI Agent的记忆护城河

2026年3月,Anthropic的AI编程助手Claude Code意外泄露51万行核心代码,暴露了其多Agent架构、六级权限验证系统及创新的记忆机制。记忆系统采用四层设计:用户自定义框架、自动记忆提取、智能上下文压缩和纯文件存储。最独特的是"自动做梦"功能,AI会定期整理记忆,类似人类睡眠记忆巩固。代码还揭示未发布功能如电子宠物系统,但也暴露权限系统漏洞和代码质量问题。这次泄露展现了AI助手核心技术的复杂性,特别是其记忆系统如何通过透明可编辑的设计建立用户信任。

program哲学 468

Android音乐播放器的设计与实现

目录 应用开发技术及开发平台介绍 应用需求分析 应用功能设计及其描述 应用UI展示 一、应用开发技术及平台介绍   ①开发技术:   本系统是采用面向对象的软件开发方法,基于Android studio开发平台,以Android作为本系统的开发语言实现音乐播放器预定的需求功能。   ②平台介绍 硬件平台   CPU奔腾双核 (主频2.0GHz)   ...

babitong2441的博客 3023

多思计组实验实验三、存储器读写实验

实验三、存储器读写实验

qq_53089329的博客 3651

CMake是什么?为什么学习CMake

CMake的主要作用和重要性,包括其在跨平台构建中的应用、如何支持多种编译器及操作系统,以及它在管理大型和复杂项目中的优势。

小鱼酱的博客 3868
上一篇: Git的使用-把本地代码上传到github的库中
下一篇: Android中GridView中onTouch监听(1)item实现触摸执行缩放动画的功能
Leafact
博客等级 码龄14年 20粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值