一个用来测试Android震动功能的小测试程序,同时包含了如下知识点:
- 全屏显示
- 按键捕获
- 确认退出
- 终止进程
- 属性菜单
- 消息提示
效果图展示如下:
代码展示如下:
布局文件就包含一行文本和两个按钮,当然还有一个背景图片(拷贝一张名为bg.jpg的桌面图片到res/drawable-hdpi目录下即可)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Android震动测试程序"
android:textColor="#000000"
/>
<Button android:text="开 始"
android:id="@+id/btnStart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<Button android:text="停 止"
android:id="@+id/btnStop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
在AndroidManifest.xml中添加震动权限的声明:
<uses-permission android:name="android.permission.VIBRATE" />
然后就是主程序代码:
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
//import android.content.Intent;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;
public class VTest extends Activity {
private Vibrator vibrator = null;
private Button btnStart;
private Button btnStop;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
try{
btnStart = (Button) this.findViewById(R.id.btnStart);
btnStart.setOnClickListener(new ClickEvent());
btnStop = (Button) this.findViewById(R.id.btnStop);
btnStop.setOnClickListener(new ClickEvent());
}catch(Exception ex){}
}
//自毁进程
protected void onDestroy() {
super.onDestroy();
android.os.Process.killProcess(android.os.Process.myPid());
}
//终止震动
protected void stop() {
if(vibrator != null){
vibrator.cancel();
vibrator = null;
}
//super.onStop();
}
//开启震动
protected void start() {
if(vibrator == null){
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
long[] pattern = {100, 5000, 100, 5000}; // OFF/ON/OFF/ON...
vibrator.vibrate(pattern, 0); //-1不重复,非-1为从pattern的指定下标开始重复
//vibrator.vibrate(10000);
}
//super.onStart();
}
//按键捕获
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
//弹出确定退出对话框
new AlertDialog.Builder(this)
.setTitle("退出")
.setMessage("确定退出吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//退出时自毁进程
onDestroy();
//当然也可以在退出时保留进程
//Intent exit = new Intent(Intent.ACTION_MAIN);
//exit.addCategory(Intent.CATEGORY_HOME);
//exit.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//startActivity(exit);
//System.exit(0);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
})
.show();
//这里不需要执行父类的点击事件,所以直接return
return true;
}
//继续执行父类的其他点击事件
return super.onKeyDown(keyCode, event);
}
//按钮响应类
class ClickEvent implements View.OnClickListener {
public void onClick(View v) {
if (v == btnStart) {
start();
}
if (v == btnStop) {
stop();
}
}
}
//创建设置菜单
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
/*
* add()方法的四个参数,依次是:
* 1、组别,如果不分组的话就写Menu.NONE,
* 2、Id,这个很重要,Android根据这个Id来确定不同的菜单
* 3、顺序,那个菜单现在在前面由这个参数的大小决定
* 4、文本,菜单的显示文本
*
* setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,以android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的
* setAlphabeticShortcut() - 设置选中此菜单项的快捷键
*
* 注:菜单项超过 6 个的话,第 6 个菜单将会变为 More 菜单,多余的菜单会在单击 More 菜单之后显示出来
*/
menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon(android.R.drawable.ic_menu_delete);
menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(android.R.drawable.ic_menu_edit);
menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon(android.R.drawable.ic_menu_help);
menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon(android.R.drawable.ic_menu_add);
menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon(android.R.drawable.ic_menu_info_details);
menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon(android.R.drawable.ic_menu_send);
menu.add(Menu.NONE, Menu.FIRST + 7, 7, "快捷").setAlphabeticShortcut('a');
/* return true才会起作用 */
return true;
}
//重写on_Options_Item_Selected用以响应选项菜单
public boolean on_Options_Item_Selected(MenuItem item){
switch (item.getItemId()) {
case Menu.FIRST + 1:
makeToast("没有内容可以被删除!");
break;
case Menu.FIRST + 2:
makeToast("没有内容可以被保存!");
break;
case Menu.FIRST + 3:
makeToast("Email: zwang@ucrobotics.com");
break;
case Menu.FIRST + 4:
makeToast("抱歉,没有新的组件可被添加!");
break;
case Menu.FIRST + 5:
makeToast("这是一个关于Android组件的测试程序!");
break;
case Menu.FIRST + 6:
makeToast("该发送功能尚未实现!");
break;
case Menu.FIRST + 7:
makeToast("因为菜单总数超过六个,所以该菜单默认被隐藏。Menu+a可以快捷调出该菜单!");
break;
}
return false;
}
//创建消息提示对象,设置在屏幕中间显示
public void makeToast(String s){
Toast toast = Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}
注意:主Java文件中有两行代码论坛无法显示,查看下面的附件!
参考链接:
[1] Android菜单详解:www.devdiv.com/home.php?mod=space&ui...;do=blog&id=3267
[2] 按键监听:edu.gamfe.com/tutor/d/34365.html
[3] Toast消息提示:www.cnblogs.com/GnagWang/archive/2010/11/26/1888762.html