• 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

  • 相关阅读:
    strcpy,memset,memcpy三者之间的根本区别
    最便捷、最强大、速度最快的C++序列化框架
    C++读写二进制文件
    boost binary 序列化
    febird.dataio和boost.serialization性能对比
    Boost文本序列化和二进制序列化的效率比较
    Boost文本序列化和二进制序列化的效率比较
    c++的vector赋值方法汇总
    OCP-1Z0-051-V9.02-36题
    遍历list或map时删除元素(较巧妙)
  • 原文地址:https://www.cnblogs.com/rabbit-bunny/p/4283288.html
Copyright © 2020-2023  润新知