ApiDemos学习知识点之os-MorseCode(13)

时间:2021-11-12 09:26:04
/*
* 这个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);
}

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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;

}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143

需要添加权限

<uses-permission android:name="android.permission.VIBRATE"/>