写完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
flag=
1
;
-
-
-
class
MyTimerTask
extends
TimerTask{
-
-
@Override
-
public
void
run() {
-
Message message=new
Message();
-
message.what=1
;
-
handler.sendMessage(message);
-
}
-
};
-
-
-
@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
)
-
-
-
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) {
-
-
}
-
@Override
-
public
void
onStartTrackingTouch(SeekBar seekBar) {
-
-
-
}
-
@Override
-
public
void
onStopTrackingTouch(SeekBar seekBar) {
-
-
}
-
});
-
audioManager = (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);
-
-
volume=audioManager.getStreamVolume(AudioManager.STREAM_RING);
-
-
-
-
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
);
-
}
-
}
分享到:
相关推荐
网上只看见过flash版本的节拍器。 自己先写了一个很简单的Java节拍器。 然后写了一个Android节拍器。打拍子的同时发声。
NULL 博文链接:https://erintojerry.iteye.com/blog/846084
一个android的小作业 简单的节拍器 有调节音量的功能
Metronome是一款用于Android的轻巧,设计良好的节拍器应用程序,致力于提供一致且可用的设计,而不会限制功能。 特别感谢设计。屏幕截图家关于主题安装该应用程序已发布在Google Play上: 或者,您可以从下载最新的...
一个android的小作业 简单的节拍器 有调节音量的功能.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
该项目分为两个主要部分:节拍器和点击音轨生成器。 节拍器旨在作为音乐家的练习辅助工具。... 节拍器和点击音轨都是动态生成的,并使用 android 音频库中的构建进行播放。 这提供了高度精确的点击。
音乐节拍器实现有应用程序还包含设计文件及源码和相关数据库 及相关音符乐理知识,有java 和android与c#及c++四种版本
该项目分为两个主要部分:节拍器和点击轨道生成器。 节拍器旨在为音乐家提供练习帮助。 它循环显示由用户指定的... 节拍器和点击轨道都是动态生成的,并使用android音频库中的构建进行播放。 这提供了非常精确的点击。
Mobile Metronome即手机节拍器,是一个免费的软件。使用简单,界面优雅,功能强大而全面,设计者是一位巴西的音乐家。 适用于android系统 适用机型: 三星 i9000, 摩托罗拉 Defy, HTC Desire HD, HTC Incredible S...
DavesMetronome 是桌面节拍器。 它是用 Java 编写的,可在 Windows XP 及更高版本上运行。 2.0 版增加了编程能力。 编写简单的练习以在指定节拍数后增加或减少速度或定义复杂的节奏模式。 有关如何使用节拍器的信息...
谷歌眼镜节拍器 谷歌眼镜节拍器卡
这是我的长期Android项目,我从2012年Spring开始作为节拍器。 感谢您提出的使事情变得更好的想法。 该项目是我在西波西米亚大学的学士论文的一部分。 目的 演奏和练习时,音乐家有时需要节拍器,调谐器,音源或录音...
支持节拍器,用于协作制作音乐或远程练习课程 支持高质量的音频,最高可达 256Kbps 输入混音器 支持声相 支持有用的效果器(噪声门、压缩器和均衡器) 可在 JACK 和 ALSA 下工作 跨平台支持(Windows、macOS、...
在android环境下运行,功能是实现一个手机上的电子节拍器。
强大的节拍均衡器,通过10个惊人的预设,5个频段,低音增强器,音乐虚拟器和3D混响效果调整等来增强您的音乐体验。 内置Mp3剪切器,铃声制作器轻松剪切音频歌曲的最佳部分并将其另存为铃声/警报/通知/音乐文件等...
Android 上都不容易使用。 如果有人想接手这个项目,请告诉我。 一个轻量级的节拍检测库,旨在实现简单性和便携性 它能做什么 lwbd 检测数字音频中的节奏开始(节拍)。 给它一个音频文件,lwbd 会为你提供它检测到...
节拍器一个 Android 应用程序,您可以在其中为具有循环功能的歌曲添加时间书签
android-heart-rate-monitor Android心率监测器介绍基于Android的心率监测器,它使用相机及其闪光灯来确定用户的心率(每分钟心跳数)。 由贾斯汀·韦瑟雷尔(Justin Wetherell)创建Google: : GitHub: : 领英...
BeatBot BeatBot是适用于Android的直观灵活的节拍制作环境。演示版特征灵活的便笺编辑网格,支持广泛的便笺粒度,允许进行网格内或网格外编程直观的多点触控支持无处不在手机或平板电脑可以处理的曲目数量回路长度和...
bandoneon和萨克斯风(实验性) 内置节拍器捷克语,法语,德语,匈牙利语,意大利语,波兰语,西班牙语,斯洛文尼亚语和俄语翻译下载及安装这是但是Nootka在许多Linux发行版的安装程序中都可用。 也在测试每晚构建...