zoukankan      html  css  js  c++  java
  • android自定义键盘(解决弹出提示的字体颜色问题)

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

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

    向先人致敬!

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

  • 相关阅读:
    SharePoint 2013 中的SQL Server 安全
    SharePoint 2013 的HTML5特性之响应式布局
    SharePoint 2013 一些小技巧
    SharePoint 2013 排错之"Code blocks are not allowed in this file"
    SharePoint 2013 创建搜索中心及搜索设置
    SharePoint 2013 使用PowerShell创建State Service
    SharePoint 2013 内容部署功能简介
    SharePoint 使用PowerShell恢复误删的网站集
    SharePoint 自定义WebPart之间的连接
    linux之misc及使用misc创建字符设备
  • 原文地址:https://www.cnblogs.com/rabbit-bunny/p/4283288.html
Copyright © 2011-2022 走看看