Android Api Demos登顶之路(九十六)Os-->MorseCode
2015-10-14 05:53
417 查看
/* * 这个demo演示了系统Vibrator (震动)的用法。 */ public class MainActivity extends Activity { private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv=(TextView) findViewById(R.id.edittext); } public void click(View v){ String text=tv.getText().toString(); long[] pattern=MorseCodeConvert.pattern(text); //获取振动器 Vibrator vibrator=(Vibrator) getSystemService(Context.VIBRATOR_SERVICE); //让振动器按照我们编排的摩尔斯密码模式振动第二个参数表示重复的次数,-1表示不重复 vibrator.vibrate(pattern, -1); } }
MorseCodeConvert是我们自定义的一个摩尔斯密码转换类
/* * 该类或以一个字符或字符串转化为摩尔斯密码。 * 其原理就是:定义一些基本的常量,分别用这些常量的不同组合表示基本的字符。 * (a-z,0-9)在本例中是不区分大小写的 */ public class MorseCodeConvert { // 定义基本常量 private static final long SPEED_BASE = 100; static final long DOT = SPEED_BASE; static final long DASH = SPEED_BASE * 3; static final long GAP = SPEED_BASE; static final long LETTER_GAP = SPEED_BASE * 3; static final long WORD_GAP = SPEED_BASE * 7; /** 用基本常量表示a-z的定义 */ private static final long[][] LETTERS = new long[][] { /* A */new long[] { DOT, GAP, DASH }, /* B */new long[] { DASH, GAP, DOT, GAP, DOT, GAP, DOT }, /* C */new long[] { DASH, GAP, DOT, GAP, DASH, GAP, DOT }, /* D */new long[] { DASH, GAP, DOT, GAP, DOT }, /* E */new long[] { DOT }, /* F */new long[] { DOT, GAP, DOT, GAP, DASH, GAP, DOT }, /* G */new long[] { DASH, GAP, DASH, GAP, DOT }, /* H */new long[] { DOT, GAP, DOT, GAP, DOT, GAP, DOT }, /* I */new long[] { DOT, GAP, DOT }, /* J */new long[] { DOT, GAP, DASH, GAP, DASH, GAP, DASH }, /* K */new long[] { DASH, GAP, DOT, GAP, DASH }, /* L */new long[] { DOT, GAP, DASH, GAP, DOT, GAP, DOT }, /* M */new long[] { DASH, GAP, DASH }, /* N */new long[] { DASH, GAP, DOT }, /* O */new long[] { DASH, GAP, DASH, GAP, DASH }, /* P */new long[] { DOT, GAP, DASH, GAP, DASH, GAP, DOT }, /* Q */new long[] { DASH, GAP, DASH, GAP, DOT, GAP, DASH }, /* R */new long[] { DOT, GAP, DASH, GAP, DOT }, /* S */new long[] { DOT, GAP, DOT, GAP, DOT }, /* T */new long[] { DASH }, /* U */new long[] { DOT, GAP, DOT, GAP, DASH }, /* V */new long[] { DOT, GAP, DOT, GAP, DOT, GAP, DASH }, /* W */new long[] { DOT, GAP, DASH, GAP, DASH }, /* X */new long[] { DASH, GAP, DOT, GAP, DOT, GAP, DASH }, /* Y */new long[] { DASH, GAP, DOT, GAP, DASH, GAP, DASH }, /* Z */new long[] { DASH, GAP, DASH, GAP, DOT, GAP, DOT }, }; /** 用基本常量表示0-9的定义 */ private static final long[][] NUMBERS = new long[][] { /* 0 */new long[] { DASH, GAP, DASH, GAP, DASH, GAP, DASH, GAP, DASH }, /* 1 */new long[] { DOT, GAP, DASH, GAP, DASH, GAP, DASH, GAP, DASH }, /* 2 */new long[] { DOT, GAP, DOT, GAP, DASH, GAP, DASH, GAP, DASH }, /* 3 */new long[] { DOT, GAP, DOT, GAP, DOT, GAP, DASH, GAP, DASH }, /* 4 */new long[] { DOT, GAP, DOT, GAP, DOT, GAP, DOT, GAP, DASH }, /* 5 */new long[] { DOT, GAP, DOT, GAP, DOT, GAP, DOT, GAP, DOT }, /* 6 */new long[] { DASH, GAP, DOT, GAP, DOT, GAP, DOT, GAP, DOT }, /* 7 */new long[] { DASH, GAP, DASH, GAP, DOT, GAP, DOT, GAP, DOT }, /* 8 */new long[] { DASH, GAP, DASH, GAP, DASH, GAP, DOT, GAP, DOT }, /* 9 */new long[] { DASH, GAP, DASH, GAP, DASH, GAP, DASH, GAP, DOT }, }; private static final long[] ERROR_GAP = new long[] { GAP }; // 将某一个字符,对照自定义的摩尔斯密码表,转化为摩尔斯密码 static long[] pattern(char c) { if (c >= 'A' && c <= 'Z') { return LETTERS[c - 'A']; } if (c >= 'a' && c <= 'z') { return LETTERS[c - 'a']; } if (c >= '0' && c <= '9') { return LETTERS[c - '0']; } return ERROR_GAP; } // 将一个字符串转换为摩尔斯密码 static long[] pattern(String str) { // 记录刚刚读取的字符是否是一个空白字符 boolean lastWasWhiteSpace; int strLen = str.length(); int len = 1; lastWasWhiteSpace = true; /* * 该算法使用lastWasWhiteSpace来控制将指定的字符串翻译成摩尔斯密码时 * 表示摩尔斯密码的长整形数组的排列规则:用定义好的摩尔斯密码表中的数据表示 * 每个字符,在每个字符之间插入一个空格,而且保证每个字符之间只有一个空格,如果 字符串当中已经有多个空格,则只保留一个空格。 * 该规则是在每个字符的前面先插入一个空格,然后再插入该字符的摩尔斯密码,所以 len是从1开始的,表示前面已经有一个空格了。 */ for (int i = 0; i < strLen; i++) { char c = str.charAt(i); if (Character.isWhitespace(c)) { // 如果上一个字符不是空格,而当前字符是空格,则将数组的长度加1 // 并将lastWasWhiteSpace置为true if (!lastWasWhiteSpace) { len++; lastWasWhiteSpace = true; } } else { // 如果当前字符不是空格,而上一个字符也不是空格则插入一个空格 if (!lastWasWhiteSpace) { len++; } // 根据当前字符修改lastWasWhiteSpace的值 lastWasWhiteSpace = false; len += pattern(c).length; } } long[] result = new long[len + 1]; // 在本例中用手机的振动来翻译摩尔斯密码,加为手机振动的模式通过是由停止状态开始 // 的而不是从振动状态开始的,所以在前面加了一个标志位0 result[0] = 0; int pos = 1; lastWasWhiteSpace = true; for (int i = 0; i < strLen; i++) { char c = str.charAt(i); if (Character.isWhitespace(c)) { // 如果上一个字符不是空格,而当前字符是空格,用WORD_GAP表示空格(这个空格是字符串中原有的空格), //数组的长度加1, 并将lastWasWhiteSpace置为true if (!lastWasWhiteSpace) { result[pos]=WORD_GAP; pos++; lastWasWhiteSpace = true; } } else { // 如果当前字符不是空格,而上一个字符也不是空格则插入一个空格(这个空格是我们故意插入的) //故意插入的空格用LETTER_GAP表示 if (!lastWasWhiteSpace) { result[pos]=LETTER_GAP; pos++; } // 根据当前字符修改lastWasWhiteSpace的值 lastWasWhiteSpace = false; long[] letter=pattern(c); //将当前字符的摩尔斯密码数组复制到目标数组当中 System.arraycopy(letter, 0, result, pos, letter.length); pos+=letter.length; } } return result; } }
需要添加权限
<uses-permission android:name="android.permission.VIBRATE"/>
相关文章推荐
- (转)Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
- Android ANR log trace日志文件分析
- Android之项目推荐使用的第三方库,有助于快速开发
- Android_程序锁
- android view类的xml属性
- android系统的常用权限
- Android 常用存储方式及使用方法总结
- Android设备相关
- android studio install
- Android消息机制使用及详解
- Android隐式启动Activity匹配详解:Action,category,data
- 利用 CMake 和 NDK 交叉编译 Android 下的可执行程序
- FlipViewPager 对item实现左右对折滑动翻页效果《IT蓝豹》
- Android事件分发
- Android学习(十)AudioFlinger(2)
- Android客户端向服务器端传值——登录实现
- Android 开发中的日常积累
- 安卓高级计算器完整版
- Android JNI使用总结(二)
- Android学习实践:11.进度条ProgressBar