android 按键 设置在哪,如何在Android设备上设置按键和按键?

OnKeyUp

和;

OnKeyDown

事件不会影响它,因为软键盘几乎不会发出这些声音。

这是一个粗略的原型,它根据预期的字符串过滤字符输入。有很多改进空间;虽然自定义实现仍然比尝试使用框架方法更好,但它可能只捕获

艾斯

关键…这个

FilteredEditText

捕捉任何输入

之前

它可能出现在屏幕上-为了实现击键模式记录器,需要将期望的字符串拆分为

ArrayList

它还可以保存各个击键之间的持续时间;一旦记录了,就可以使用收集到的信息进行比较。

/**

* Filtered {@link AppCompatEditText}

* @author Martin Zeitler

* @version 1.0.0

**/

public class FilteredEditText extends AppCompatEditText {

private static final String LOG_TAG = FilteredEditText.class.getSimpleName();

private String expectedString = null;

public FilteredEditText(Context context) {

super(context);

}

public FilteredEditText(Context context, AttributeSet attrs) {

super(context, attrs);

}

public FilteredEditText(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

public void setExpectedString(@NonNull String value) {

this.expectedString = value;

this.setupInputFilter();

}

public void setupInputFilter() {

this.setFilters(new InputFilter[] {

new InputFilter() {

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int destStart, int destEnd) {

if (source.length() > 0 && source.charAt(end-1) == expectedString.charAt(destEnd)) {

/* valid input received */

Log.d(LOG_TAG, "input accepted: " + String.valueOf(source.charAt(end-1)));

return source;

} else {

/* invalid input received */

Log.d(LOG_TAG, "input rejected: " + String.valueOf(source.charAt(end-1)) + " - expected: " + String.valueOf(expectedString.charAt(destEnd)));

return "";

}

}

}

});

}

/** hardware event */

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

Log.d(LOG_TAG, "onKeyDown()");

return super.onKeyDown(keyCode, event);

}

/** hardware event */

@Override

public boolean onKeyUp(int keyCode, KeyEvent event) {

Log.d(LOG_TAG, "onKeyUp()");

return super.onKeyUp(keyCode, event);

}

}

用途:

FilteredEditText mTextInput = findViewById(R.id.text_input);

mTextInput.setExpectedString("9RJhl6aH0n");

LogCAT输出:

D/FilteredEditText: input accepted: 9

D/FilteredEditText: input rejected: r - expected: R

D/FilteredEditText: input rejected: 4 - expected: R

D/FilteredEditText: input accepted: R

到目前为止,我已经用一个软件键盘测试了它……而我目前不能用BT硬件键盘测试它,因为电池是空的。我认为

InputFilter

捕获所有输入。

几乎没有

通键

键控下

软件键盘触发的事件可以得到补偿,因为当知道何时对击键进行过滤时,这仍然会导致类似的模式——即使无法测量击键的持续时间,也不会由于软件键盘的限制而导致击键的攻击速度——唯一可能的解决办法是d正在执行硬件键盘或创建一个软件键盘,为所有键发出这些事件(与默认值相反)。

GBoard

也不

SwiftKey

)我只是想知道现在刷卡打字和语音打字…因为这是物理上几乎不考虑的东西

击键

动力学。甚至留下了反馈

黑板

,因为在某些情况下,可选地发出密钥代码会有所帮助。

当处理键盘事件时,

KeyEvent

类和相关的API,您应该期望这样的键盘事件只来自硬件键盘。对于软输入方法(屏幕键盘)上的任何键,都不应依赖于接收键事件。

在使用按钮时,仍然可以使用硬件事件,而按钮会发出这些事件;例如:

/**

* Fake Hardware {@link AppCompatButton}

* @see KeyEvent

* @author Martin Zeitler

* @version 1.0.0

**/

public class FakeHardwareButton extends AppCompatButton {

private BaseInputConnection mInputConnection;

private int keyCode = KeyEvent.KEYCODE_9;

private KeyEvent keyDown;

private KeyEvent keyUp;

public FakeHardwareButton(Context context) {

this(context, null);

}

public FakeHardwareButton(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public FakeHardwareButton(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@SuppressLint("ClickableViewAccessibility")

private void setupInputConnection(View targetView) {

this.mInputConnection = new BaseInputConnection(targetView, true);

this.keyDown = new KeyEvent(KeyEvent.ACTION_DOWN, this.keyCode);

this.keyUp = new KeyEvent(KeyEvent.ACTION_UP, this.keyCode);

this.setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

switch(event.getAction()) {

case MotionEvent.ACTION_DOWN:

mInputConnection.sendKeyEvent(keyDown);

return true;

case MotionEvent.ACTION_UP:

mInputConnection.sendKeyEvent(keyUp);

return true;

}

return false;

}

});

}

}

问题是,

KeyEvent.KEYCODE_9

KeyEvent.KEYCODE_NUMPAD_9

是不一样的,因此人们总是要比较

String

表示数字键的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值