android虚拟键监听
㈠ Android自定义软键盘
Android自定义键盘的使用
1、新建一个xml文件夹放在res目录下面,然后新建xml文件:money_keyboard.xml
2、然后在XML文件中添加按钮布局,这个布局就是键盘的样子了
3 属性介绍:
Keyboard:
存储键盘以及按键相关信息。
android:horizontalGap
按键之间默认的水平间距。
android:verticalGap
按键之间默认的垂直间距。
android:keyHeight
按键的默认高度,以像素或显示高度的百分比表示。
android:keyWidth:
按键的默认宽度,以像素或显示宽度的百分比表示。
Row:
为包含按键的容器。
Key:
用于描述键盘中单个键的位置和特性。
android:codes
该键输出的unicode值。
android:codes 官网介绍是说这个是该键的unicode 值或者逗号分隔值,当然我们也可以设置成我们想要的值,在源码中提供了几个特定的值
对照表:
android:isRepeatable
这个属性如果设置为true,那么当长按该键时就会重复接受到该键上的动作,在 删除键键 和 空格键 上通常设为true。
android:keyLabel
显示在按键上的文字。
android:keyIcon 与 keyLabel
是二选一关系,它会代替文字以图标的形式显示在键上。
android:keyWidth="33.33333%p"
每一个按钮的宽度,可以设置百分比
android:keyHeight="10%p"
每一个按钮高度,可以设置百分比
KeyboardView是一个渲染虚拟键盘的View。 它处理键的渲染和检测按键和触摸动作。
显然我们需要KeyboardView来对Keyboard里的数据进行渲染并呈现给我们以及相关的点击事件做处理。 1)//设置keyboard与KeyboardView相关联的方法。
public void setKeyboard(Keyboard keyboard)
2)//设置虚拟键盘事件的监听,此方法必须设置,不然会报错。
public void setOnKeyboardActionListener(OnKeyboardActionListener listener) 步骤上呢,做完第一步的关联,并设置第二步的事件,调用KeyboardView.setVisible(true);键盘就可以显示出来了, 是不是很简单。不过到这里还没有结束哦,接下来我们为了使用上的便利要进行相应的封装。 封装 这里我们通过继承EditText来对Keyboard与KeyboardView进行封装。
attr.xml文件,这里我们需要通过一个xml类型的自定义属性引入我们的键盘描述文件。
1、新建一个类,我取名叫KeyUtils然后在里面新建三个属性。KeyBoard用处可大了,他才是本体,可以通过设置他来切换键盘。
2、构造函数,初始下三个参数。
3、先说下预览图吧,就是效果图上的预览图,需要预览图的话的将setPreviewEnabled设置为true,不过还得在布局文件中的android.inputmethodservice.KeyboardView标签对立面设置预览布局。否则,不会有字。至于设置的布局,一个TextView就好了~
onPress: 按下触发。
onRelease:松开触发。
onKey : 松开触发,在OnRelease之前触发。
swipeLeft : 左滑动,其他同理。哈哈~就这么懒。
onText :需要在 键盘xml,也就是我此时的number.xml里面中key标签对里添加一个
㈡ 如何在Android的service里进行按键的监听
app中对于HOME键广播事件的接收
首先,自定义一个BroadcastReceiver:
[java] view plain
class HomeKeyEventBroadCastReceiver extends BroadcastReceiver {
static final String SYSTEM_REASON = "reason";
static final String SYSTEM_HOME_KEY = "homekey";//home key
static final String SYSTEM_RECENT_APPS = "recentapps";//long home key
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_REASON);
if (reason != null) {
if (reason.equals(SYSTEM_HOME_KEY)) {
// home key处理点
} else if (reason.equals(SYSTEM_RECENT_APPS)) {
// long home key处理点
}
}
}
}
}
其次,生成且注册之
[java] view plain
receiver = new HomeKeyEventBroadCastReceiver();
registerReceiver(receiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
这样,我们就可以在app中进行HOME键的处理了!
㈢ android中怎么实现按键监听和触屏监听
按键监听代码:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_UP:
y--;break;
case KeyEvent.KEYCODE_DPAD_LEFT:
x--;break;
case KeyEvent.KEYCODE_DPAD_DOWN:
y++;break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
x++;break;
}
this.invalidate();
return true;
}
触屏监听代码:
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
x=(int)event.getX();
y=(int)event.getY();
this.invalidate();
return true;
}
通过鼠标可以使图形任意移动。将apk文件下载到手机上就可以实现触屏监听。
㈣ 求教Android 按键监听和按键模拟问题
1.看下输入法的结构机制吧,apidemo中有流程,应该是可以的
2.模拟按键当然可以,发送一个keycode就可以了
InputConnectionic=getCurrentInputConnection();
if(null!=ic){
//code种类有很多
ic.sendKeyEvent(
newKeyEvent(KeyEvent.ACTION_DOWN,keyEventCode));
ic.sendKeyEvent(
newKeyEvent(KeyEvent.ACTION_UP,keyEventCode));
}
㈤ Android键盘处理-监听键盘状态并实现QQ拉出式弹出回复框。
** 本文将一步一步讲解实现上述三种设计 **
获取键盘显示状态的原理是:首先利用getRootView().getHeight() 获取屏幕高度,在利用getWindowVisibleDisplayFrame 获取应用显示区域,但是这个区域不包含虚拟按键的区域(虚拟键盘、手机底部虚拟按键),我们根据前者与后者之差与状态栏高度的比较来判断键盘的显示与隐藏状态。
** 需要特别指出的是,在某些手机上,比如华为mate8,底部会出现一个可以随时隐藏与显示的一行虚拟按键(Android杂乱生态的无奈🙂),所以我们要定义一个最小键盘高度。 **
这样根据ShowKeyboard值的变化 就能判断键盘的显示与隐藏了。
这里利用的就是焦点,点击其他区域,键盘会失去焦点,这个时候我们可以强制隐藏键盘,因为EditText 焦点已经缺失,某些隐藏键盘的方法可能失效。
这里主要实现方法是监听用户手势,同时判断键盘状态,判断webView是否滑动到底部了。
注意手势监听,不要遗忘以下操作:
最后看一下实现的效果图:
㈥ android 怎样监听软键盘关闭
我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面;在点击搜索框的时候,点击右下角的search符号键可以进行搜索;或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作。
function 1:
重写Activity的dispatchKeyEvent(KeyEvent event)方法,在其中监听KeyEventKey.KEYCODE_ENTER键(右下角确定键),当此键按下的时候,隐藏输入法软键盘,设置edittext内容和加载webview内容。
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.KEYCODE_ENTER){
/*隐藏软键盘*/
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(inputMethodManager.isActive()){
inputMethodManager.hideSoftInputFromWindow(MainActivity.this.getCurrentFocus().getWindowToken(), 0);
edittext.setText("success");
webview.loadUrl(URL);
return true;
return super.dispatchKeyEvent(event);
}
function 2:
重写dispatchKeyEvent(KeyEvent event)的方法感觉有点用牛刀的感觉,因为我们非常可能在这个方法中进行其他任务,所以我们可以使用OnKeyListener的方法来监听软键盘按键。
private OnKeyListener onKeyListener = new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_ENTER){
/*隐藏软键盘*/
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(inputMethodManager.isActive()){
inputMethodManager.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0);
edittext.setText("success");
webview.loadUrl(URL);
return true;
return false;
};
edittext.setOnKeyListener(onKeyListener);
function 3:
第三种方法我认为可以帮助程序员更精确的判断右下角按键情况,以便应对更加复杂的情况。它可以帮助程序员依据当前邮件下为“GO”,“done”,“search”键的情况下做出更细分的操作。
edittext.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
/*判断是否是“GO”键*/
if(actionId == EditorInfo.IME_ACTION_GO){
/*隐藏软键盘*/
InputMethodManager imm = (InputMethodManager) v
.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.hideSoftInputFromWindow(
v.getApplicationWindowToken(), 0);
edittext.setText("success");
webview.loadUrl(URL);
return true;
return false;
});
㈦ 如何在android 中service后台监听按键,比如监听音量键
为了实现键盘的监控,从新开发一个输入法是不现实的,一般的操作就是在系统的输入法机制中添加接口回调。我们知道,再应用程序中拿到按键的回调一般是监听onKeyDown的接口,如下所示:publicbooleanonKeyDown(intkeyCode,KeyEventevent)开发者就可以根据回调方法中的参数,keyCode与KeyEvent来判断具体事件。但是,由于事件的回调机制在其的沙箱中运行,在其他应用中是无法拿到当前应用事件回调的。那么我们就从上到下,具体的看看事件的传递机制。如下图所示,用户点击后,软键盘或物理按键的输入驱动就会产生一个中断,且向/dev/input/event*中写入一个相应的信号量。Android操作系统则会循环的读取其中的事件,再分发给WindowManagerServer。由WindowManagerServer根据事件的来源分发到各个不同的ViewGroup与View中,从而产生不同的OnClick、OnKeyDown和OnTouch等事件。这个时候很自然的想到,黑客们希望做键盘监控,一定会向Linux底层增加自定义的事件。这里我们使用的是Linux中的getevent获得/dev/input/eventX设备汇报的事件,这个命令还会输出所有event设备的基本信息。包括触屏、按键、耳机插入等等。其基本用法如下:Usage:getevent[-t][-n][-sswitchmask][-S][-v[mask]][-d][-p][-i][-l][-q][-ccount][-r][device]-t:showtimestamps-n:don'tprintnewlines-s:printswitchstatesforgivenbits-S:printallswitchstates-v:verbositymask(errs=1,dev=2,name=4,info=8,vers=16,pos.events=32,props=64)-d:showHIDdescriptor,ifavailable-p:showpossibleevents(errs,dev,name,pos.events)-i:-l:-q:quiet(clearverbositymask)-c:-r:printrateeventsarereceived键入getevent后,我们能够看到设备中的一些列输入硬件驱动信息,同样下面会出现很多输入指令信号,通常情况下,这些信号量都在刷屏,如下图所示:这些信号量的表示我们无法直接看懂,输入getevent–l加入Label我们能够看到一些添加的标签,如下所示:其实这些Lable已经在其input.h头文件中定义好,其中type的定义如下:/**Eventtypes*/#defineEV_SYN0x00#defineEV_KEY0x01#defineEV_REL0x02#defineEV_ABS0x03#defineEV_MSC0x04#defineEV_SW0x05#defineEV_LED0x11#defineEV_SND0x12#defineEV_REP0x14#defineEV_FF0x15#defineEV_PWR0x16#defineEV_FF_STATUS0x17#defineEV_MAX0x1f#defineEV_CNT(EV_MAX+1)一般来说,常用的是EV_KEY、EV_REL、EV_ABS、EV_SYN,分别对应键盘按键、相对坐标、绝对坐标、同步事件。EV_SYN则表示一组完整事件已经完成,需要处理,EV_SYN的code定义事件分发的类型。
㈧ Android 手机软键盘的弹起和关闭的监听
在很多Android App 开发的过程中,需要对Activity 中 软键盘的弹起和关闭进项监听,但是Andoid中并没有提供相对应的api进行监听, 我有一个简单的方法。
首先需要知道一些基础知识
在manifest文件中可以设置Activity的android:windowSoftInputMode属性,这个属性值常见的设置如下:android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
那么这里值的含义列表如下:
1、stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
2、stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
3、stateHidden:用户选择activity时,软键盘总是被隐藏
4、stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
5、stateVisible:软键盘通常是可见的
6、stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
7、adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
8、adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
9、adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
案例:
1.我们需要将监听所在的Activity在Manifest文件中的设置为如下形式:
<activity
android:name="com.zy.project.MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN/>
<category android:name="android.intent.category.LAUNCHER/>
</intent-filter>
</activity>
当有软键盘弹起时,Activity的布局大小会被滚动上去,但是你仍然可以通过滑动浏览所有。
2 需要在外层布局文件设置一个id,并在activity 中设置监听
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnLayoutChangeListener;
import android.widget.Toast;
public class MainActivity extends Activity implements OnLayoutChangeListener{
//Activity最外层的Layout视图
private View rootView;
//屏幕高度
private int screenHeight = 0;
//软件盘弹起后所占高度阀值 一般是占用屏幕的1/3
private int keyHeight = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rootView = findViewById(R.id.root_layout);
//获取屏幕高度
screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
//阀值设置为屏幕高度的1/3
keyHeight = screenHeight/3;
}
@Override
protected void onResume() {
super.onResume();
//添加layout大小发生改变监听器
rootView.addOnLayoutChangeListener(this);
}
@Override
public void onLayoutChange(View v, int left, int top, int right,int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值
// System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);
// System.out.println(left + " " + top +" " + right + " " + bottom);
//现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起
if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){
Toast.makeText(MainActivity.this, "监听到软键盘弹起...", Toast.LENGTH_SHORT).show();
}else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){
Toast.makeText(MainActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show();
}
}
本文来自:http://m.blog.csdn.net/bear_huangzhen/article/details/45896333