标签:
最近准备要做一个项目,需要用到自定义小键盘来确保安全,而且还需要精确获得用户点击键盘时的落点位置、力度、指尖接触屏幕的面积等参数。
在写自定义键盘的时候,用到了国内网上的一些代码,出处是
向先人致敬!
然后发现down下来的代码用到我的项目时,出现了各种问题:
1.首先,是一打开应用,就会出现弹出的是系统的输入法键盘,而是不自定义键盘,这个问题是由于EditText会在应用打开的使用获得焦点,导致直接弹出系统输入法,而不是自定义输入法。解决的办法是使EditText在应用打开时不获取焦点,于是我在activity对应的布局文件的全局Layout标签中加入
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文件,里面这样写
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
标签:
原文地址:http://www.cnblogs.com/rabbit-bunny/p/4283288.html