最近准备要作一个项目,须要用到自定义小键盘来确保安全,并且还须要精确得到用户点击键盘时的落点位置、力度、指尖接触屏幕的面积等参数。html
在写自定义键盘的时候,用到了国内网上的一些代码,出处是java
向先人致敬!android
而后发现down下来的代码用到个人项目时,出现了各类问题:安全
1.首先,是一打开应用,就会出现弹出的是系统的输入法键盘,而是不自定义键盘,这个问题是因为EditText会在应用打开的使用得到焦点,致使直接弹出系统输入法,而不是自定义输入法。解决的办法是使EditText在应用打开时不获取焦点,因而我在activity对应的布局文件的全局Layout标签中加入ide
1
2
|
android:focusable=
true
android:focusableInTouchMode=
true
|
那么在activity运行时,EditText就失去了焦点,系统输入法也不会弹出。而后对EditText加入触摸监听器,当点击EditText控件时,就响应弹出咱们的键盘函数
1
2
3
4
5
6
7
8
9
10
11
12
|
et.setOnTouchListener(
new
View.OnTouchListener(){
@Override
public
boolean
onTouch(View v, MotionEvent event) {
int
inputback = et.getInputType();
et.setInputType(InputType.TYPE_NULL);
AdvantageKeyboard kb =
new
AdvantageKeyboard(act,ctx,et);
kb.showKeyboard();
et.setInputType(inputback);
v.performClick();
return
false
;
}
});
|
2.点击时,键盘弹出的提示框里面没有字体。例如这样布局
这是因为显示的字体时白色,而背景也是白色致使的。后来各类百度,有人说是由于theme的问题,由于我用的是android5.0.1的API,自动生成项目时,生成的activity是直接继承ActionBarActivity的,直接改theme会致使应该出现秒退现象。若是要改theme就要先改继承ActionBarActivity为Activity,而后再去改theme,可是我很不喜欢这样,由于这样没有通用性,后来在google了一下外国人的贴子,才了解到这个弹出的东西叫preview,咱们能够修改它的布局的。字体
在咱们自定义的KeyboardView中加入android:keyPreviewLayout标签,加入后以下:网站
而后在layout文件夹中,新建一个key_preview_layout.xml文件,里面这样写ui
1
2
|
<!--?xml version=
1.0
encoding=utf-
8
?-->
<textview android:background=
"#ff8888ff/"
android:gravity=
"center"
android:layout_height=
"wrap_content"
android:layout_width=
"wrap_content"
android:textcolor=
"@android:color/white"
android:textsize=
"40sp"
xmlns:android=
"http://schemas.android.com/apk/res/android"
></textview>
|
其中android:background就是咱们的提示框的背景颜色,android:textColor是字体颜色,改为你喜欢的就OK了。
3.加入键盘的触摸响应,并记录点击的相关信息(力度,接触面积,落点坐标等)。
咱们能够在自定义键盘中的构造函数中对keyboardView加入触摸监听器,例如这样写构造方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
AdvantageKeyboard(Activity act, Context ctx, EditText edit) {
this
.act = act;
this
.ctx = ctx;
this
.ed = edit;
kb_letter =
new
Keyboard(
this
.ctx, R.xml.qwerty);
kb_number =
new
Keyboard(
this
.ctx, R.xml.symbols);
keyboardView = (KeyboardView)
this
.act.findViewById(R.id.keyboard_view);
keyboardView.setKeyboard(kb_number);
is_nun =
true
;
keyboardView.setEnabled(
true
);
keyboardView.setPreviewEnabled(
true
);
keyboardView.setOnKeyboardActionListener(action_listener);
keyboardView.setOnTouchListener(touch_listener);
//加入触摸监听器
}
|
而后new一个咱们处理这些数据的监听器,须要咱们“重载”(可能叫“覆盖”比较合适)OnTouch函数,把采集的数据显示到Locat上。须要注意的是,这个OnTouch函数假如返回值为true,就表明这个动做已被处理,为false就表明没被处理,因为后面还有其余函数须要得到此动做,因此这里返回false,不然,接下来的对按键动做的响应(字体输出等)将不会发生。
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
|
private
OnTouchListener touch_listener =
new
OnTouchListener(){
@Override
public
boolean
onTouch(View v, android.view.MotionEvent event) {
float
pressure, size, rx, ry, x, y, interval;
long
time, down_time;
int
action = event.getAction();
switch
(action) {
case
(MotionEvent.ACTION_DOWN):
pressure = event.getPressure();
size = event.getSize();
time = event.getEventTime();
down_time = event.getDownTime();
x = event.getX();
y = event.getY();
rx = event.getRawX();
ry = event.getRawY();
interval = (
float
)
0.0
;
if
(is_first_press){
interval = down_time - last_down_time;
}
is_first_press =
true
;
last_down_time = down_time;
Log.i(!!!!!!!!!,pressure:+String.valueOf(pressure)+
+size:+String.valueOf(size)+
+time:+String.valueOf(time)+
+downtime:+String.valueOf(down_time)+
+x:+String.valueOf(x)+ y:+String.valueOf(y)+
+rx:+String.valueOf(rx)+ ry:+String.valueOf(ry)+
+interval:+String.valueOf(interval)+
);
break
;
case
(MotionEvent.ACTION_UP):
v.performClick();
break
;
case
(MotionEvent.ACTION_MOVE):
break
;
}
return
false
;
}
};
|
结伴旅游,一个免费的交友网站:www.jieberu.com
推推族,免费得门票,游景区:www.tuituizu.com