Xamarin Android - 自定义 KeyEvent
Xamarin Android - custom KeyEvent
我创建了一个带有十六进制数字键(0..9、A..F)的自定义 Android 键盘。它没有 Shift/CapsLock 键。
自定义键盘的布局在 .xml 文件中定义,如下所示:
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="33%p" android:horizontalGap="0px" android:verticalGap="0px" android:keyHeight="50dip">
<Row>
<Key android:codes="7" android:keyLabel="0" android:keyEdgeFlags="left" />
<Key android:codes="8" android:keyLabel="1" />
<Key android:codes="9" android:keyLabel="2" />
<Key android:codes="10" android:keyLabel="3" />
<Key android:codes="11" android:keyLabel="4" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="12" android:keyLabel="5" android:keyEdgeFlags="left" />
<Key android:codes="13" android:keyLabel="6" />
<Key android:codes="14" android:keyLabel="7" />
<Key android:codes="15" android:keyLabel="8" />
<Key android:codes="16" android:keyLabel="9" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="29" android:keyLabel="A" android:keyEdgeFlags="left" />
<Key android:codes="30" android:keyLabel="B" />
<Key android:codes="31" android:keyLabel="C" />
<Key android:codes="32" android:keyLabel="D" />
<Key android:codes="33" android:keyLabel="E" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="67" android:keyIcon="@drawable/sym_keyboard_delete" android:iconPreview="@drawable/sym_keyboard_delete" android:keyEdgeFlags="left" />
<Key android:codes="34" android:keyLabel="F" />
<Key android:codes="66" android:keyEdgeFlags="right" android:keyIcon="@drawable/sym_keyboard_feedback_return" android:iconPreview="@drawable/sym_keyboard_feedback_return" />
</Row>
</Keyboard>
自定义键盘工作正常,我唯一的问题是 'A' 到 'F' 键实际上生成小写字符,我希望将它们转换为大写字符。
我的自定义键盘的按键事件处理程序是这样的:
mHexKeyboardView.Key += (sender, e) => {
long eventTime = JavaSystem.CurrentTimeMillis();
// Create a new key event
// KeyEvent(long downTime, long eventTime, int action, int code, int repeat, int metaState, int deviceId, int scancode, int flags)
KeyEvent ev = new KeyEvent(eventTime, eventTime, KeyEventActions.Down, e.PrimaryCode, 0, 0, 0, 0, KeyEventFlags.SoftKeyboard | KeyEventFlags.KeepTouchMode);
this.DispatchKeyEvent(ev);
};
而且我想在 Key 事件处理程序中强制 "conversion" 为大写(而不是在其他任何地方)。例如,当按下键 'A' 时,
e.PrimaryCode = Android.Views.Keycode.A,我的 EditView 应接收字符 'A' 而不是 'a'.
我想我应该向 KeyEvent() 构造函数提供一些 'metaState' 值并拥有密钥 'shifted',也许吧?
关于这个话题有suggestions/examples吗?
谢谢!
您需要使用 MetaKeyStates.ShiftLeftOn
的 MetaState 作为 KeyEvent 构造函数中的第 6 个参数来表明您希望移动值。但是你只需要对你需要继续发送0的数字的字母(A到B)执行此操作。
为此,您可以创建如下内容:
var shiftedArray = new [] { "A", "B", "C", "D", "E", "F"};
mKeyboardView.Key += (sender, e) => {
long eventTime = JavaSystem.CurrentTimeMillis();
var isShifted = shiftedArray.Any (a => a == e.PrimaryCode.ToString());
MetaKeyStates metaKeyState = isShifted ? MetaKeyStates.ShiftLeftOn : 0;
KeyEvent ev = new KeyEvent(eventTime, eventTime, KeyEventActions.Down, e.PrimaryCode, 0, metaKeyState , 0, 0, KeyEventFlags.SoftKeyboard | KeyEventFlags.KeepTouchMode);
this.DispatchKeyEvent(ev);
};
您在 shiftedArray
中输入的任何值都将被移动。您可以将其替换为 IF、switch/case 或您认为更适合您的任何其他算法,为简单起见,这样做是为了简单。
希望对您有所帮助!
我创建了一个带有十六进制数字键(0..9、A..F)的自定义 Android 键盘。它没有 Shift/CapsLock 键。 自定义键盘的布局在 .xml 文件中定义,如下所示:
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="33%p" android:horizontalGap="0px" android:verticalGap="0px" android:keyHeight="50dip">
<Row>
<Key android:codes="7" android:keyLabel="0" android:keyEdgeFlags="left" />
<Key android:codes="8" android:keyLabel="1" />
<Key android:codes="9" android:keyLabel="2" />
<Key android:codes="10" android:keyLabel="3" />
<Key android:codes="11" android:keyLabel="4" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="12" android:keyLabel="5" android:keyEdgeFlags="left" />
<Key android:codes="13" android:keyLabel="6" />
<Key android:codes="14" android:keyLabel="7" />
<Key android:codes="15" android:keyLabel="8" />
<Key android:codes="16" android:keyLabel="9" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="29" android:keyLabel="A" android:keyEdgeFlags="left" />
<Key android:codes="30" android:keyLabel="B" />
<Key android:codes="31" android:keyLabel="C" />
<Key android:codes="32" android:keyLabel="D" />
<Key android:codes="33" android:keyLabel="E" android:keyEdgeFlags="right" />
</Row>
<Row>
<Key android:codes="67" android:keyIcon="@drawable/sym_keyboard_delete" android:iconPreview="@drawable/sym_keyboard_delete" android:keyEdgeFlags="left" />
<Key android:codes="34" android:keyLabel="F" />
<Key android:codes="66" android:keyEdgeFlags="right" android:keyIcon="@drawable/sym_keyboard_feedback_return" android:iconPreview="@drawable/sym_keyboard_feedback_return" />
</Row>
</Keyboard>
自定义键盘工作正常,我唯一的问题是 'A' 到 'F' 键实际上生成小写字符,我希望将它们转换为大写字符。
我的自定义键盘的按键事件处理程序是这样的:
mHexKeyboardView.Key += (sender, e) => {
long eventTime = JavaSystem.CurrentTimeMillis();
// Create a new key event
// KeyEvent(long downTime, long eventTime, int action, int code, int repeat, int metaState, int deviceId, int scancode, int flags)
KeyEvent ev = new KeyEvent(eventTime, eventTime, KeyEventActions.Down, e.PrimaryCode, 0, 0, 0, 0, KeyEventFlags.SoftKeyboard | KeyEventFlags.KeepTouchMode);
this.DispatchKeyEvent(ev);
};
而且我想在 Key 事件处理程序中强制 "conversion" 为大写(而不是在其他任何地方)。例如,当按下键 'A' 时, e.PrimaryCode = Android.Views.Keycode.A,我的 EditView 应接收字符 'A' 而不是 'a'.
我想我应该向 KeyEvent() 构造函数提供一些 'metaState' 值并拥有密钥 'shifted',也许吧?
关于这个话题有suggestions/examples吗?
谢谢!
您需要使用 MetaKeyStates.ShiftLeftOn
的 MetaState 作为 KeyEvent 构造函数中的第 6 个参数来表明您希望移动值。但是你只需要对你需要继续发送0的数字的字母(A到B)执行此操作。
为此,您可以创建如下内容:
var shiftedArray = new [] { "A", "B", "C", "D", "E", "F"};
mKeyboardView.Key += (sender, e) => {
long eventTime = JavaSystem.CurrentTimeMillis();
var isShifted = shiftedArray.Any (a => a == e.PrimaryCode.ToString());
MetaKeyStates metaKeyState = isShifted ? MetaKeyStates.ShiftLeftOn : 0;
KeyEvent ev = new KeyEvent(eventTime, eventTime, KeyEventActions.Down, e.PrimaryCode, 0, metaKeyState , 0, 0, KeyEventFlags.SoftKeyboard | KeyEventFlags.KeepTouchMode);
this.DispatchKeyEvent(ev);
};
您在 shiftedArray
中输入的任何值都将被移动。您可以将其替换为 IF、switch/case 或您认为更适合您的任何其他算法,为简单起见,这样做是为了简单。
希望对您有所帮助!