最近准备要做一个项目,需要用到自定义小键盘来确保安全,而且还需要精确获得用户点击键盘时的落点位置、力度、指尖接触屏幕的面积等参数。

在写自定义键盘的时候,用到了国内网上的一些代码,出处是

向先人致敬!

然后发现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

android自定义键盘(解决弹出提示的字体颜色问题)的更多相关文章

  1. android中常用的弹出提示框

    转自:http://blog.csdn.net/centralperk/article/details/7493731 我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的 ...

  2. Android软键盘强制弹出,隐藏输入法.

    本文实例讲述了Android实现弹出键盘代码,是一个非常实用的功能.代码非常简洁.分享给大家供大家参考. 具体功能代码如下: ? 1 2 3 4 5 6 7 8 Timer timer = new T ...

  3. android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

    需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果,  总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...

  4. android标题栏下面弹出提示框(一) TextView实现,带动画效果

    产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...

  5. Android 另类方法监听软键盘的弹出收起事件

    http://www.cnblogs.com/csonezp/p/5065624.html 最近做的项目碰到个问题,a界面是fragment+recyclerview,b界面带个edittext,并且 ...

  6. Android: View换切后,无法正常设置焦点或切换后TextView的虚拟键盘不弹出

    边学.边测试,花了三天时间完工一个小应用. 遇到很多问题,但最终还是解决了. 我的手机是Android2.2版,所以我也在是2.2版环境下学习,开发. 1. 在同一个Activity中的不同View( ...

  7. 关于Android 打开新的Activity 虚拟键盘的弹出与不弹出

    关于Android 打开新的Activity 虚拟键盘的弹出与不弹出 打开Activity 时  在相应的情况 弹出虚拟键盘 或者 隐藏虚拟键盘 会给用户非常好的用户体验 , 实现起来也比较简单 只需 ...

  8. form WebBrowser自动点击弹出提示框alert、弹出对话框confirm、屏蔽弹出框、屏蔽弹出脚本错误的解决办法

    针对WebBrowser控件中自动点击弹出框及禁用脚本提示问题得到如下几种实际情况的解决办法,绝对管用. 1.屏蔽弹出错误脚本 将WebBrowser控件ScriptErrorsSuppressed设 ...

  9. Android中检测软键盘的弹出和关闭

    Android系统并没有提供明显的API来监听软键盘的弹出和关闭,但是在某些情况下我们还是有办法来检测软键盘的弹出和关闭. 从StackOverflow找到了一个不错的方法.但是这种只适用于在mani ...

随机推荐

  1. Java深入分析类与对象

    深入分析类与对象 1,成员属性封装 在类之中的组成就是属性与方法,一般而言方法都是对外提供服务的,所以是不会进行封装处理的,而对于属性需要较高的安全性,所以往往需要对其进行保护,这个时候就需要采用封装 ...

  2. JDBC24homework

    编写程序: 创建一个类DBTools,在DBTools中创建一个方法find,find方法用于对数据库进行查询操作,现在要求将结果集封装成数组线性表嵌套数组的形式: ArrayList<Stri ...

  3. Js 更换html同一父元素下子元素的位置

    //更换两个元素的位置 var exchange=function (el1, el2) { var ep1 = el1[0].parentNode, ep2 = el2[0].parentNode, ...

  4. 修改源码去除zblog博客分类目录的RSS图标

    zblog博客的所建立的分类默认前面是有一个RSS图标的,如下图所示: 其实这个图标的存在并不能起到太大的美化作用,增加用户订阅数量的作用.那么应该如何去掉这个RSS图标呢? 这个RSS图标的生成在z ...

  5. 学习笔记--Tarjan算法之割点与桥

    前言 图论中联通性相关问题往往会牵扯到无向图的割点与桥或是下一篇博客会讲的强连通分量,强有力的\(Tarjan\)算法能在\(O(n)\)的时间找到割点与桥 定义 若您是第一次了解\(Tarjan\) ...

  6. STL之Deque的使用方法

    STL 中类 stack 实现了一个栈 1)push 能够插入元素 2)pop 移除栈顶元素 使用的时候,需要包含头文件 #include <stack>,stack 被声明如下: nam ...

  7. 2.OR Mapping 介绍

    定义: ORM(Object Relational Mapping) -- 是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术. 简单说:ORM是通过使用描述对象和数据库之间的映射的元数据 ...

  8. oracle解锁

    --以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$proce ...

  9. 第十章、jupyter入门之pandas

    目录 第十章.jupyter入门之pandas 一.什么是pandas 二.Series 三.基本概念 四.基本运算 五.DataFrame 第十章.jupyter入门之pandas 一.什么是pan ...

  10. centos redis自启动

    #!/bin/sh # chkconfig: 2345 90 10 # description: Redis is a persistent key-value database # Simple R ...