編輯:關於Android編程
今天給大家介紹的是怎麼樣使用ToneGenerator編寫按鍵發聲功能,這個在我們開發的時候用到的地方很多(例如電話鍵盤按鍵),那麼我們就來看看吧,下面我們就用一個例子來說說怎麼樣能實現這個功能。
package com.jeavox.testtonegenerator;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Bundle;
import android.provider.Settings;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button btn, btn2, btn3;
private int value;
private ToneGenerator mToneGenerator;
private Object mToneGeneratorLock = new Object();
// 監視器對象鎖
private boolean mDTMFToneEnabled;
// 按鍵操作音
private static final int TONE_LENGTH_MS = 150;
// 延遲時間
private AudioManager mAudioManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn.setText(value + "");
playTone(value);
value++;
if (value > 9) {
value = 0;
}
}
});
btn2 = (Button) findViewById(R.id.button2);
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playTone(42);
// *: 42
}
});
btn3 = (Button) findViewById(R.id.button3);
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playTone(35);
// #: 35
}
});
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mDTMFToneEnabled = Settings.System.getInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1;
synchronized (mToneGeneratorLock) {
if (mToneGenerator == null) {
try {
mToneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC, 80);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
} catch (Exception e) {
e.printStackTrace();
mToneGenerator = null;
}
}
}
}
// 播放按鍵聲音
void playTone(int tone) {
if (!mDTMFToneEnabled) {
return;
}
int ringerMode = mAudioManager.getRingerMode();
if ((ringerMode == AudioManager.RINGER_MODE_SILENT) || (ringerMode == AudioManager.RINGER_MODE_VIBRATE)) {
// 靜音或者震動時不發出按鍵聲音
return;
}
synchronized (mToneGeneratorLock) {
if (mToneGenerator == null) {
return;
}
mToneGenerator.startTone(tone, TONE_LENGTH_MS);
// 發聲
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
一、為何寫作此文??你是不是經常看到很多書籍中說:不能在子線程中操作ui,不然會報錯。你是不是也遇到了如下的疑惑(見下面的代碼):@Override prote
我們知道,在Android系統中,同一時刻,只有一個Activity窗口是激活的,但是,對於WindowManagerService服務來說,這並不意味著它每次只需要管理
今年剛開始學習android,不過是做修改源碼,自己在寢室捎帶學習了下做APP,由於是剛開始學習,這個游戲只注重了游戲的實現,實現了大概功能後,也沒有實現游戲的細節,像分
中文名:坐標矩陣高等數學裡有介紹,在圖像處理方面,主要是用於平面的縮放、平移、旋轉等操作。在Android裡面,Matrix由9個float值構成,是一個3*3的矩陣。最