- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据 KeyboardView.OnKeyboardActionListener.onRelease()
SDK 文档,“对于重复的键,只调用一次”。但是,如果我使用 Android Softkeyboard 示例将“a”键的 isRepeatable 设置为 true,并记录 onPress()
、onKey()
和 onRelease()
方法调用,我得到了预期的重复,但我观察到单个按下/重复/释放序列的以下日志:
I/SoftKeyboard(31467): onPress: 97
I/SoftKeyboard(31467): onKey: 97
I/SoftKeyboard(31467): onRelease: 97
I/SoftKeyboard(31467): onKey: 97
I/SoftKeyboard(31467): onRelease: 97
I/SoftKeyboard(31467): onKey: 97
I/SoftKeyboard(31467): onRelease: 97
I/SoftKeyboard(31467): onKey: 97
I/SoftKeyboard(31467): onRelease: 97
I/SoftKeyboard(31467): onKey: 97
I/SoftKeyboard(31467): onRelease: 97
如何准确确定触摸设备何时被释放?谢谢,D。
编辑(Paul Boddington 编辑,2015 年 7 月 30 日)
虽然我不是 OP,但我想包含一个显示问题的完整示例。
MyActivity
:
public class MyActivity extends Activity {
private static final String TAG = "MyActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
KeyboardView keyboardView = (KeyboardView) findViewById(R.id.keyboard_view);
keyboardView.setKeyboard(new Keyboard(this, R.xml.keyboard));
keyboardView.setOnKeyboardActionListener(new KeyboardView.OnKeyboardActionListener() {
@Override
public void onPress(int i) {
Log.i(TAG, "onPress: " + i);
}
@Override
public void onKey(int i, int[] ints) {
Log.i(TAG, "onKey: " + i);
}
@Override
public void onRelease(int i) {
Log.i(TAG, "onRelease: " + i);
}
@Override public void onText(CharSequence charSequence) {}
@Override public void swipeLeft() {}
@Override public void swipeRight() {}
@Override public void swipeDown() {}
@Override public void swipeUp() {}
});
}
}
keyboard.xml
:
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android">
android:layout_height="wrap_content"
android:layout_width="match_parent"
>
<Row
android:keyWidth="25%p"
android:keyHeight="60dp">
<Key android:codes="0" android:keyLabel="0" android:isRepeatable="true"/>
<Key android:codes="1" android:keyLabel="1" />
<Key android:codes="2" android:keyLabel="2" />
<Key android:codes="3" android:keyLabel="3" />
</Row>
</Keyboard>
activity_my.xml
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.inputmethodservice.KeyboardView
android:id="@+id/keyboard_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
/>
</LinearLayout>
最佳答案
我不知道如何修复 KeyboardView
以正确发出可重复键的 onRelease()
。因此,我想出了一个解决方法,通过查看 MotionEvent.ACTION_UP
来识别版本。您只对可重复键执行此操作,同时忽略这些键的 onRelease()
事件。
private List<Integer> mRepeatableKeys = new ArrayList<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final KeyboardView keyboardView = (KeyboardView) findViewById(R.id.keyboard_view);
keyboardView.post(new Runnable() {
@Override
public void run() {
for( Keyboard.Key key : keyboardView.getKeyboard().getKeys() )
{
if(key.repeatable) mRepeatableKeys.add(key.codes[0]);
}
}
});
keyboardView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if(mTrackingRepeatableKey != -1)
{
Log.i(TAG, "Repeatable key released: " + mTrackingRepeatableKey);
mTrackingRepeatableKey = -1;
}
}
return false;
}
});
keyboardView.setKeyboard(new Keyboard(this, R.xml.keyboard));
keyboardView.setOnKeyboardActionListener(mKeyboardActionListener);
}
private int mTrackingRepeatableKey = -1;
KeyboardView.OnKeyboardActionListener mKeyboardActionListener = new KeyboardView.OnKeyboardActionListener() {
@Override
public void onPress(int i) {
Log.i(TAG, "onPress: " + i);
if( mRepeatableKeys.contains(i))
{
mTrackingRepeatableKey = i;
}
}
@Override
public void onKey(int i, int[] ints) {
if( mRepeatableKeys.contains(i))
{
Log.i(TAG, "onKey Repeat: " + i);
return;
}
Log.i(TAG, "onKey: " + i);
}
@Override
public void onRelease(int i) {
// Ignore release for repeatable keys
if( mRepeatableKeys.contains(i)) return;
Log.i(TAG, "onRelease: " + i);
}
@Override
public void onText(CharSequence text) {
}
@Override
public void swipeLeft() {
}
@Override
public void swipeRight() {
}
@Override
public void swipeDown() {
}
@Override
public void swipeUp() {
}
};
在 Android 5.1 上测试。日志现在显示为:
I/MainActivity﹕ onPress: 1
I/MainActivity﹕ onKey Repeat: 1
I/MainActivity﹕ onKey Repeat: 1
I/MainActivity﹕ onKey Repeat: 1
I/MainActivity﹕ onKey Repeat: 1
I/MainActivity﹕ onKey Repeat: 1
I/MainActivity﹕ onKey Repeat: 1
I/MainActivity﹕ onKey Repeat: 1
I/MainActivity﹕ onKey Repeat: 1
I/MainActivity﹕ Repeatable key released: 1
如果你愿意,你可以扩展 KeyboardView 并在其中包含所有这些丑陋的逻辑。
关于android - 为什么在每次重复按键后调用 android KeyboardView.OnKeyboardActionListener.onRelease()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29059489/
我对 JavaScript 上的 onkeypress 事件有疑问。 是否可以仅检测 Cntl 键或 Alt 键?此时,如果同时按下 Cntl 和 m,则 onkeypress 事件可以触发单击。是否
我想知道按键中允许使用什么样的字符。它是否也生成一个符号下划线(_)?我总是得到一个带有 - 字母的按键。 最佳答案 按键使用修改过的 Base64 字母表: -0123456789ABCDEFGHI
我有以下格式的(格式错误的DITA)XML: BLARG BLARG Definition BLARG2 BLARG2 Definition BLARG3 BLARG3 Definition
我有两个单独的对象数组,如果特定键值匹配,我需要将它们合并。分析数据后可能更有意义: 数组 1 let categories = [ { id: 5, slug: 'category-5',
由于我是新手,所以我的低效编码给大家带来了巨大的麻烦,对此我提前表示歉意。 我正在尝试在 HTML5 Canvas 上使用 Javascript 制作一个非常基本的游戏,但我似乎找不到一种简单的方法来
我试图找出将多维数组中的对象 id 属性映射到共享相同 id 的另一个数组中的对象值的最佳方法。 举个例子,我有一个像这样的genre_ids数组: 0: {id: 1, name: 'sci-fi'
我有一个游戏,当按下一个键时,您可以通过将子弹添加到 Controller 类来发射子弹。这是代码来自 KeyPressed(); else if (key == KeyEvent.VK_Q && !
我想比较两个字典的长度以及每个字典中每个键、值对的长度。如果在查找时没有匹配项,我还需要能够打印出来。 我当前的代码似乎传递了长度标准,但在尝试匹配元素时失败: assert_that(len(mod
我正在寻找一种跨平台(Win 和 MacOS)方法来检测 C# 中 OpenGL 应用程序的按键。 以下有效,但仅适用于字母数字字符。 protected override void OnKeyPre
我正在 try catch 按键事件(向上和向下翻页),但根本没有收到任何按键事件。这是相关代码:构造函数: private MainLayout() { imageView = new Im
$(el).bind('blur keypress', function(event){ if(event.type == 'keypress' && event.keyCode != 13) r
我有这段代码: while (SDL_PollEvent(&event)) { if (event.type == SDL_KEYDOWN) { switch(event.key.keys
我正在使用下面的代码: $(document).keypress(function (e) { if (e.which === 68 || e.which === 100) {
我正在用 html 和 javascript 制作游戏。只是为了澄清,这不是重复或任何东西。没有什么可以给我我需要的答案。另外,在解释之前,我想说我对按键监听器没有任何问题,我的游戏知道何时按下按键以
我正在尝试用 Javascript 制作游戏,但目前我已经陷入停滞。我正在尝试检测按键并检查它们是否不断按下以移动 Angular 色。这是我正在使用的代码: var THREE; var keys;
我得到了多维数组。我想从每个子数组中删除/取消设置索引为 1 的值。我的数组 $data。 Array ( [3463] => Array ( [0]
我正在设计一个基于网络的会计软件。例如,每当用户按 N 键时,我想打开“新会计凭证”。并在他/她按下 S 键时打开“设置”。 我看到了一些基于 JavaScript 和 jQuery 的脚本。但它们并
阅读此主题后: Keypress events stopped working outside of "input" elements in Meteor after update to 0.5.2
所以,当我按下按钮 1“1 PLAY/STOP”时,按钮变成绿色,当我再次按下它时它会去除颜色。 如果我按下 button2“2 PLAY/STOP”,同样的事情会发生。 如果两个按钮之一播放而我按下
非常直接的问题。 只想按一个键盘键。像输入一样,使用 pywin auto。我不想在任何应用程序窗口的上下文中按下它。 只是键盘键的原始按键,如 a 或 enter 或退格。 最佳答案 只需使用 #
我是一名优秀的程序员,十分优秀!