GL音乐播放器--代码实现<四>--进度控制和可隐藏的音量控制

本文详细介绍了在音视频应用中实现进度控制和音量控制的方法。通过SeekBar组件,结合Java代码实现了用户手动调整播放进度及音量的功能,并展示了具体的XML布局配置与相关监听器设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇,我会将如何实现进度控制和音量控制的代码进行讲解。

一、进度控制:

 

布局文件:

<SeekBar 
	   		android:id="@+id/seekBar"
	   		android:layout_width="fill_parent" 
	   		android:layout_height="wrap_content"	
	   		android:layout_toRightOf="@id/textViewCurTime"
	   		android:layout_toLeftOf="@id/textViewTotalTime"
	   		android:paddingLeft="5dp"
	   		android:paddingRight="5dp"
			android:max="100" 
			android:progressDrawable="@drawable/seekbar_style"  
	   		android:thumb="@drawable/seekbar_thumb"
	   		android:background="@drawable/progress_buffering" >
	   		</SeekBar>


java代码:

获得View并为它设置监听器

	mPlayProgress = (SeekBar) findViewById(R.id.seekBar);
	mPlayProgress.setOnSeekBarChangeListener(new SeekBarChangeListener());
private class SeekBarChangeListener implements OnSeekBarChangeListener {

				@Override
				public void onProgressChanged(SeekBar seekBar, int progress,
						boolean fromUser) {
					switch(seekBar.getId()) {
					case R.id.seekBar:
						if (fromUser) {
							mServiceManager.seekTo(progress); // 用户控制进度的改变
						}
						break;
					case R.id.GL_player_voice:
						// 设置音量
						am.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
						System.out.println("am--->" + progress);
						break;
					}
				}

下面是seekTo方法:

public boolean seekTo(int rate)
	{
		if (mMusicConnect != null)
		{
			try {
				return mMusicConnect.seekTo(rate);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	
		
		return false;
	}

这样,一个进度条就完成了。

二、音量控制

布局文件:

 <RelativeLayout
            android:visibility="gone" 
            android:layout_toLeftOf="@id/buttonVolumn"
            android:layout_toRightOf="@id/buttonMode"
                
            android:id="@+id/ll_player_voice"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/player_progresslayout_bg"
             >
            <SeekBar
                android:id="@+id/GL_player_voice"
                
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:paddingLeft="5dp"
	   	android:paddingRight="5dp"
		android:progressDrawable="@drawable/seekbar_style"  
	   	android:max="15"
	   	android:background="@drawable/progress_buffering" 
                android:thumb="@drawable/voice_seekbar_thumb" />
</RelativeLayout>
			

里面那个android:visibility="gone"就是隐藏的意思,如果你对visibility不熟悉,可以参照我的博文http://blog.youkuaiyun.com/google_acmer/article/details/19342643      

那里有我详尽的解释。


java代码:

首先是声明,并获得音频服务对象

//音量调节面板显示和隐藏的动画
	    	showVoicePanelAnimation = AnimationUtils.loadAnimation(MusicPlayActivity.this, R.anim.push_up_in);
	    	hiddenVoicePanelAnimation = AnimationUtils.loadAnimation(MusicPlayActivity.this, R.anim.push_up_out);
	    		
	    	//获得系统音频管理服务对象
	    	am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
	    	currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
	    	maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
	    	GL_player_voice.setProgress(currentVolume);

接下来是隐藏面板的控制以及音量控制

//控制显示音量控制面板的动画
			public void voicePanelAnimation() {
				if(ll_player_voice.getVisibility() == View.GONE) {
					ll_player_voice.startAnimation(showVoicePanelAnimation);
					ll_player_voice.setVisibility(View.VISIBLE);
				}
				else{
					ll_player_voice.startAnimation(hiddenVoicePanelAnimation);
					ll_player_voice.setVisibility(View.GONE);
				}
			}
			private class SeekBarChangeListener implements OnSeekBarChangeListener {

				@Override
				public void onProgressChanged(SeekBar seekBar, int progress,
						boolean fromUser) {
					switch(seekBar.getId()) {
					case R.id.seekBar:
						if (fromUser) {
							mServiceManager.seekTo(progress); // 用户控制进度的改变
						}
						break;
					case R.id.GL_player_voice:
						// 设置音量
						am.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
						System.out.println("am--->" + progress);
						break;
					}
				}

				@Override
				public void onStartTrackingTouch(SeekBar seekBar) {

				}

				@Override
				public void onStopTrackingTouch(SeekBar seekBar) {

				}

			}



 

 

<think>首先,用户的问题是:()用于从remote_ip将文件tftp到本地。选项是: A. tfpt -gl <file> <remote_ip> B. tfpt -pl <file> <remote_ip> C. tfpt -ml <file> <remote_ip> D. tfpt -nl <file> <remote_ip> 我注意到命令是 "tfpt",但标准的TFTP命令应该是 "tftp"。用户可能打错了,应该是 "tftp"。在上下文中,我应该假设是 "tftp",因为TFTP是常见的协议。 TFTP (Trivial File Transfer Protocol) 是一个简单的文件传输协议。用于从服务器下载文件或上传文件到服务器。 在TFTP命令中: - 下载文件(从服务器获取文件到本地)通常使用 "get" 选项。 - 上传文件(从本地发送文件到服务器)通常使用 "put" 选项。 用户的问题是:"从remote_ip将文件tftp到本地",意思是下载文件,从远程IP获取文件到本地。 所以,正确的选项应该是用于下载文件的命令。 现在,查看选项: A. tfpt -gl <file> <remote_ip> B. tfpt -pl <file> <remote_ip> C. tfpt -ml <file> <remote_ip> D. tfpt -nl <file> <remote_ip> 选项使用了 "-gl", "-pl", "-ml", "-nl"。在标准的TFTP客户端中,选项通常是: - -g 或 --get 用于下载(get) - -p 或 --put 用于上传(put) 在Unix/Linux系统中,tftp命令的常用选项: - tftp -m mode 或类似,但标准是: - tftp -g 用于获取文件 - tftp -p 用于放置文件 具体到选项: - -g 通常表示 get(下载) - -p 通常表示 put(上传) 其他选项如 -l, -r 等,但这里选项是像 "-gl", "-pl"。 在选项中,有 "-gl", "-pl" 等。这可能是一个组合选项。 在标准tftp命令中,选项是分开的,比如: - tftp -g -l localfile -r remotefile host 但这里选项是连在一起的,如 "-gl"。 回顾用户输入: A. tfpt -gl <file> <remote_ip> B. tfpt -pl <file> <remote_ip> C. tfpt -ml <file> <remote_ip> D. tfpt -nl <file> <remote_ip> 命令是 "tfpt",但应该是 "tftp"。选项是 "-gl", "-pl" 等。 在上下文中,我需要推断哪个选项用于下载。 标准TFTP命令: - 下载文件:tftp -g -r remotefile host - 上传文件:tftp -p -r remotefile -l localfile host 或类似 但选项的顺序指定可能不同。 具体到这些选项: - "-gl":可能 -g 表示 get, -l 可能表示 local file?但在下载时,通常指定远程文件。 选项是 "-gl <file> <remote_ip>",这里 <file> 可能是远程文件名,<remote_ip> 是服务器IP。 在下载命令中,通常需要指定远程文件名本地文件名,但这里只指定了 <file> <remote_ip>,没有本地文件名。可能 <file> 是远程文件,本地文件名相同或默认。 在标准tftp中,下载命令类似: tftp -g -r remotefile host 其中 -r 指定远程文件。 但这里选项是 "-gl",没有 -r。 可能 "-gl" 是组合选项。 我回忆:在一些实现中,tftp 命令可能使用不同的选项。 常见的是: - tftp -g 用于 get - tftp -p 用于 put 选项 "-l" 可能用于指定本地文件。 例如: - 下载:tftp -g -l localfile -r remotefile host 但这里选项是 "-gl",可能表示 -g -l 的组合。 同样,"-pl" 可能表示 -p -l。 对于下载(从服务器获取文件到本地),应该是 get 操作,所以 -g。 选项 A 是 "-gl",B 是 "-pl",C "-ml",D "-nl"。 所以 A. -gl 可能表示 get with local file? 但命令是 "tfpt -gl <file> <remote_ip>",这里 <file> 可能是远程文件,<remote_ip> 是主机。 在上下文中,对于下载,-g 是 get。 - -p 是 put,用于上传。 - -m -n 可能不是标准选项。 在标准中,-m 可能用于 mode(binary or ascii),-n 可能用于某种设置。 但核心是,下载应该使用 -g。 所以选项 A. tfpt -gl <file> <remote_ip> 可能用于下载。 确认:在TFTP中,get 操作是下载,put 是上传。 用户说:"从remote_ip将文件tftp到本地",意思是下载文件到本地。 所以正确选项应该是 A. -gl,假设 -g 表示 get。 选项 B. -pl 应该是 put,用于上传。 C D 可能无效。 在之前的用户历史中,有类似问题,比如关于tar命令的,选项是标准用法。 在TFTP命令中,具体语法: 例如,在Linux中,tftp命令: - 下载文件:tftp -g -r remotefile host - 上传文件:tftp -p -r remotefile -l localfile host 但这里选项是 "-gl",没有 -r。 在用户输入中,是 "tfpt -gl <file> <remote_ip>",所以 <file> 可能是远程文件,<remote_ip> 是主机。 在下载时,本地文件名可能相同或需要指定,但命令中没有指定本地文件,所以可能 -gl 中的 -l 表示本地文件?但顺序是 -gl <file> <remote_ip>,所以 <file> 可能是远程文件。 这有点混乱。 或许在上下文中,-gl 表示 get local? 但标准是 -g for get. 我搜索记忆:在一些系统,tftp客户端可能使用 -c 或其它,但通常 -g 是 get. 查看选项: A. -gl B. -pl C. -ml D. -nl 在TFTP中,常见选项缩写: - -g: get - -p: put - -l: 可能用于本地文件 --gl 可能不是标准;标准是分开的选项。 在用户输入中,命令是 "tfpt",但应该是 "tftp",选项是 "-gl" 等。 或许在问题中,选项是设计好的,我需要选择正确的。 从逻辑上,下载文件应该用 get,所以 -g 选项。 选项 A 有 -g,B 有 -p (put),C D 有 -m -n,可能不是用于传输。 所以正确选项是 A。 类似地,在之前的例子中,如tar命令,选项是标准。 所以我认为 A. tfpt -gl <file> <remote_ip> 用于下载。 在回答中,我需要解释。 现在,回答格式:必须用中文。 首先,回答问题,给出正确选项解析。 然后,在末尾,必须输出 "§§相关问题§§" 后跟3-5个相关问题。 "§§相关问题§§" 必须在一行,不能换行分散。 基于用户的问题我的回答提出相关问题。 用户的问题是:用于从remote_ip将文件tftp到本地的命令。 我的回答将涉及TFTP下载命令。 所以相关问题可以围绕TFTP使用、其他命令等。 例如: 1. TFTP的上传命令是什么? 2. TFTP与FTP的区别? 3. 如何设置TFTP服务器? 等等。 现在,构建回答。 回答结构: - 首先,给出正确选项:A. tfpt -gl <file> <remote_ip> - 解析:解释为什么正确。 命令是 "tfpt",但应该是 "tftp",所以在回答中,我应该指出可能拼写错误,但基于上下文。 在解析中,可以说:正确命令是 tftp -g 用于下载文件,但选项是 -gl,可能表示 get 操作。 为了准确,假设命令是 tftp。 在回答中:用于从remote_ip将文件tftp到本地(即下载文件)的正确命令是 A. tfpt -gl <file> <remote_ip>。 解析:-g 选项表示 get(下载),-l 可能用于指定本地文件或其它,但在此上下文中,该命令用于下载文件。 选项 B 的 -p 表示 put(上传),C D 的 -m -n 不是标准下载选项。 然后,输出 "§§相关问题§§" 3-5个问题。 相关问题: 1. 如何使用TFTP上传文件到远程服务器? 2. TFTP协议有哪些安全限制? 3. 在Windows系统中,如何执行TFTP文件传输? 4. TFTP与SCP在文件传输中的主要区别是什么? 5. 如何配置一个TFTP服务器? 现在,确保回答完整。 最后,输出 "§§相关问题§§" 在一行,然后问题列表。</think>用于从remote_ip将文件tftp到本地(即下载文件)的正确命令是 **A. tfpt -gl <file> <remote_ip>**。 - **解析**: - **A. tfpt -gl <file> <remote_ip>**:`-g` 选项表示 "get" 操作(下载文件),`-l` 可能用于指定本地文件或处理模式,在此命令中用于从远程IP下载文件到本地。 - **B. tfpt -pl <file> <remote_ip>**:`-p` 选项表示 "put" 操作(上传文件),与下载需求相反。 - **C. tfpt -ml <file> <remote_ip>**:`-m` 选项通常用于设置传输模式(如二进制或ASCII),不直接用于文件下载。 - **D. tfpt -nl <file> <remote_ip>**:`-n` 选项可能用于无交互模式或特定配置,但不支持下载功能。 注意:命令 "tfpt" 可能存在拼写错误,标准应为 "tftp";实际使用中,需确保命令正确性(如 Linux/Unix 系统)。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值