写完Java节拍器,本以为能够很容易的过渡到Android节拍器。后来发现不对。在网上查询了之后,才知道,Android考虑到线程安全问题,不允许在线程中执行UI线程。这里我们要学到一个Android中重要的类:android.os.Handler,这个可以实现各处线程间的消息传递。
我们可以在原先的TimerTask子类MyTimerTask的方法run()中,只是给Handler发送一个Message。我们让Handler进行UI线程上的操作(在节拍器的例子中,指的是更新那个显示节拍的控件的数值)。
最终节拍器打节拍的同时发生。(由于时间原因,音量控制尚未实现)实现截图如下:

package com.Android.Jiapaiqi;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;
import java.util.Timer;
import java.util.TimerTask;
public class ActivityMain extends Activity {
Button button_start;
Button button_stop;
EditText edit_sudu;
EditText edit_paishu;
TextView result;
SeekBar seekbar;
public float tempo;
public int section;
public int pp;
Handler handler;
Timer mytimer;
private SoundPool sndHigh;
private SoundPool sndLow;
private int hitOfHigh;
private int hitOfLow;
//声音控制
private AudioManager audioManager;
//声音变量
private int volume=0;
//声音模式
//private int mode;
//是否有声音
private int flag=1;
//内部类
class MyTimerTask extends TimerTask{
@Override
public void run() {
Message message=new Message();
message.what=1;
handler.sendMessage(message);
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pp=1;
setContentView(R.layout.main);
final EditText edit_sudu = (EditText)this.findViewById(R.id.edit_sudu);
final EditText edit_paishu = (EditText)this.findViewById(R.id.edit_paishu);
final TextView result = (TextView)findViewById(R.id.result);
handler = new Handler()
{
public void handleMessage(Message msg)
{
switch(msg.what)
{
case 1:
result.setText(String.valueOf(pp));
if(pp==1)
// play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
//播放音频,可以对左右音量分别设置,还可以设置优先级,循环次数以及速率
sndHigh.play(hitOfHigh, 1, 1, 0, 0, 1);
else
sndLow.play(hitOfLow, 1, 1, 0, 0, 1);
if(pp!=section)
{
pp++;
}
else
{
pp=1;
}
break;
}
super.handleMessage(msg);
}
};
button_start = (Button) findViewById(R.id.button_start);
button_start.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
tempo=Float.parseFloat(edit_sudu.getText().toString());
section=Integer.parseInt(edit_paishu.getText().toString());
mytimer=new Timer();
float tempFloat=60/tempo*1000;
mytimer.schedule(new MyTimerTask(),0, (long)tempFloat);
}
});
button_stop = (Button) findViewById(R.id.button_stop);
button_stop.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mytimer.cancel();
sndHigh.pause(hitOfHigh);
sndLow.pause(hitOfLow);
}
});
final SeekBar seekbar = (SeekBar) findViewById(R.id.seekbar);
//设置拖动条的初始值和文本框的初始值
seekbar.setMax(7);
seekbar.setProgress(5);
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
});
audioManager = (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);
//通过getStreamVolume获得当前音量大小
volume=audioManager.getStreamVolume(AudioManager.STREAM_RING);
//把当前音量的值 设置给进度条
//seekbar.setProgress(volume);
sndHigh = new SoundPool(10, AudioManager.STREAM_SYSTEM,5);
//载入音频流
hitOfHigh = sndHigh.load(getBaseContext(), R.drawable.high, 0);
sndLow = new SoundPool(10, AudioManager.STREAM_SYSTEM,5);
//载入音频流
hitOfLow = sndLow.load(getBaseContext(), R.drawable.low, 0);
}
}
再给出一篇比较好的文章:
Android计时器正确应用方式解析
http://developer.51cto.com/art/201001/180254.htm

- 大小: 31.9 KB
分享到:
相关推荐
而"Android节拍器-定时·发声"可能是个Android项目的部分源码,包含了节拍器的定时功能和声音播放的实现。 总结起来,这个项目不仅展示了如何在桌面环境下用Java编写节拍器,还扩展到了移动端的Android平台,通过...
节拍器,显示程序已调完成效果很好,欢迎新朋友参考。
在这个“微信小程序简单节拍器demo完整源码”中,我们可以深入学习如何利用微信小程序框架开发一个音乐相关的应用程序,特别是关于节拍器的功能实现。 1. **微信小程序框架**: 微信小程序使用一套基于WXML...
在Android平台上开发一款节拍器应用是一个典型的移动应用编程任务,涉及到音频处理、用户界面设计以及事件处理等多个方面的知识。以下是对这个项目中关键知识点的详细说明: 1. **音频处理**:节拍器的核心功能是...
这个安卓音乐播放器项目是一个基于Android平台的简单节拍器应用,它包含了调节音量的功能。在深入探讨这个项目的知识点之前,我们先了解一下节拍器的基本概念。节拍器是音乐演奏中的一个重要工具,用于保持稳定的...
Metronome是一款用于Android的轻巧,设计良好的节拍器应用程序,致力于提供一致且可用的设计,而不会限制功能。 特别感谢设计。屏幕截图家关于主题安装该应用程序已发布在Google Play上: 或者,您可以从下载最新的...
【标题】"节拍器软件电子节拍器v10.0.2.54中文绿色免费版"涉及的主要知识点如下: 1. 节拍器软件:节拍器是音乐学习中的一个重要辅助工具,主要用于帮助音乐演奏者保持稳定的节奏。电子节拍器则是其数字形式,通常...
Java定时执行方法与节拍器是程序开发中常见的需求,特别是在服务器端应用或者后台服务中,需要定期执行某些任务,例如数据同步、日志清理、定时推送等。本篇文章将深入探讨Java中如何实现定时执行的方法,并介绍一个...
【描述】"节拍器简单版"可能是一个轻量级的应用程序,它简化了传统节拍器的功能,以满足用户对基础节奏控制的需求。这款应用可能专注于提供基本的节拍设定、速度调整以及直观的界面,使得音乐爱好者能够快速上手并...
在音乐制作和演奏中,节拍器扮演着至关重要的角色,尤其对于电子音乐制作人和乐手来说,精准的节奏掌控是作品质量的关键。"节拍器(非常好用)"这款电子节拍器软件,正是为了满足这一需求而设计的。它不仅提供了传统...
电子节拍器是一种重要的音乐设备,它通过发出稳定、精确的节奏信号来帮助音乐家保持节奏。在现代科技的帮助下,我们可以使用电路设计软件,如Multisim,进行电子节拍器的模拟和仿真,以便理解和设计这样的系统。下面...
该项目分为两个主要部分:节拍器和点击音轨生成器。 节拍器旨在作为音乐家的练习辅助工具。... 节拍器和点击音轨都是动态生成的,并使用 android 音频库中的构建进行播放。 这提供了高度精确的点击。
节拍器,非常简洁实用。节拍器,非常简洁实用。节拍器,非常简洁实用。节拍器,非常简洁实用。
4. **Flash技术**:Flash是一种广泛应用于创建交互式动画、网页元素以及在线应用程序的技术,它使得这款节拍器能够在多种设备上运行,无需额外安装软件,只需浏览器支持即可使用。 5. **实用性与便利性**:与传统的...
该项目分为两个主要部分:节拍器和点击轨道生成器。 节拍器旨在为音乐家提供练习帮助。 它循环显示由用户指定的... 节拍器和点击轨道都是动态生成的,并使用android音频库中的构建进行播放。 这提供了非常精确的点击。
在这个“微信小程序-简单节拍器demo完整源码”中,我们可以深入理解微信小程序的开发过程以及音视频处理的相关技术。 1. **微信小程序框架** 微信小程序基于微信自家的开发框架WXML(Weixin Markup Language)和...
《电子节拍器Multisim仿真源文件解析与学习指南》 电子节拍器是音乐制作和学习中不可或缺的工具,它能为演奏者提供稳定、准确的节奏参考。在这个数字化时代,电子节拍器的设计与实现也逐渐转向了数字电路和虚拟仿真...
主程序模块负责整个节拍器的初始化,包括存储单元、定时器、中断和标志位的配置,并根据用户的按键输入选择相应功能。节拍器功能模块主要负责实现节拍的速度调节,速度范围在24拍到400拍每分钟之间,精度误差小于0.4...
1. **节拍器.exe**:这是节拍器软件的可执行文件,双击即可启动程序。这个文件包含了所有实现节拍器功能的代码和资源,用户可以通过它来使用节拍器的各项功能,如设定不同的节拍速度、选择不同音效等。 2. **使用...