相关文章推荐
可爱的木耳  ·  python ...·  1 年前    · 
急躁的番茄  ·  C# ...·  1 年前    · 
乐观的西瓜  ·  CVer - 知乎·  1 年前    · 
从容的木耳  ·  文件中的'\0'和'\n' ...·  2 年前    · 

先废话一下,说说开发键盘的原因:像理财产品、银行等app客户端登录时,尤其是要输入密码时,会屏蔽掉系统默认输入法,改为自己的输入法!这个是考虑安全,以及防止被输入法软件记录密码等问题!所以,安全性极高的app都会要求密码等都用自己的输入法,这就有开发的需求 了!

言归正传:开发这种软件盘,从什么地方开始着手呢?

先看 Android 给我们提供的Demo
关于软键盘的Demo,在以下目录中能找到:
..\samples\android-22\legacy\SoftKeyboard

步骤二:键盘布局

从Demo中可以看出,键盘的开发和界面开发不一样,虽然键盘也需要布局,但是却不是用的布局文件,而是在xml目录里的文件
先来看个:

qwerty.xml文件:

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="10%p"
    android:horizontalGap="0px"
    android:verticalGap="0px"
    android:keyHeight="@dimen/key_height"
        <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
        <Key android:codes="119" android:keyLabel="w"/>
        <Key android:codes="101" android:keyLabel="e"/>
        <Key android:codes="114" android:keyLabel="r"/>
        <Key android:codes="116" android:keyLabel="t"/>
        <Key android:codes="121" android:keyLabel="y"/>
        <Key android:codes="117" android:keyLabel="u"/>
        <Key android:codes="105" android:keyLabel="i"/>
        <Key android:codes="111" android:keyLabel="o"/>
        <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
    </Row>
        <Key android:codes="97" android:keyLabel="a" android:horizontalGap="5%p" 
                android:keyEdgeFlags="left"/>
        <Key android:codes="115" android:keyLabel="s"/>
        <Key android:codes="100" android:keyLabel="d"/>
        <Key android:codes="102" android:keyLabel="f"/>
        <Key android:codes="103" android:keyLabel="g"/>
        <Key android:codes="104" android:keyLabel="h"/>
        <Key android:codes="106" android:keyLabel="j"/>
        <Key android:codes="107" android:keyLabel="k"/>
        <Key android:codes="108" android:keyLabel="l" android:keyEdgeFlags="right"/>
    </Row>
        <Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift" 
                android:keyWidth="15%p" android:isModifier="true"
                android:isSticky="true" android:keyEdgeFlags="left"/>
        <Key android:codes="122" android:keyLabel="z"/>
        <Key android:codes="120" android:keyLabel




    
="x"/>
        <Key android:codes="99" android:keyLabel="c"/>
        <Key android:codes="118" android:keyLabel="v"/>
        <Key android:codes="98" android:keyLabel="b"/>
        <Key android:codes="110" android:keyLabel="n"/>
        <Key android:codes="109" android:keyLabel="m"/>
        <Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete" 
                android:keyWidth="15%p" android:keyEdgeFlags="right"
                android:isRepeatable="true"/>
    </Row>
    <Row android:rowEdgeFlags="bottom">
        <Key android:codes="-3" android:keyIcon="@drawable/sym_keyboard_done" 
                android:keyWidth="15%p" android:keyEdgeFlags="left"/>
        <Key android:codes="-2" android:keyLabel="123" android:keyWidth="10%p"/>
            android:codes: -101 is not a framework-defined key code but a key code that is
            privately defined in com.example.android.softkeyboard.LatinKeyboardView.
        <Key android:codes="-101" android:keyIcon="@drawable/sym_keyboard_language_switch"
                android:keyWidth="10%p"/>
        <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" 
                android:keyWidth="30%p" android:isRepeatable="true"/>
        <Key android:codes="46,44" android:keyLabel=". ,"
                android:keyWidth="15%p"/>
        <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return" 
                android:keyWidth="20%p" android:keyEdgeFlags="right"/>
    </Row>
</Keyboard>
 
  • 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
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 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
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

分析一下:
1>从以上代码可以看出,布局主要是在Keyboard的文件里进行的,每一行以< Row>开始和结束,键则是以< key>为起始节点,而键盘是监听键的数字码为主要监听对象的,label 只是键盘的显示标签;
2>
而Keyboard 节点里的属性android:keyWidth=”10%p” 是指:如果键key的节点里没有该属性,则宽度为 整个屏幕宽度的10%,如果key的节点里有该属性,则以key的节点属性为最终值;
3>key节点属性里android:codes=”46,44” ,codes为两个,意思是:第一次点击是46的字符串,第二次点击是44的字符串,两次点击相隔一秒的时间;

步骤三:分析代码

键盘组件是继承KeyboardView,而自定义的,通过使用Keyboard类加载键盘布局文件,并通过KeyboardView.setKeyboard(Keyboard keyboard)的方法,将布局赋值到View里;具体如下:
1>使用Keyboard类加载xml文件:

Keyboard keyboard=new Keyboard(context, R.xml.qwerty);

2>将Keyboard赋值给view,使用KeyboardView里的方法setKeyboard赋值

 setKeyboard(keyboard);

步骤四 给View设置监听事件

设置监听事件setOnKeyboardActionListener,实现onKey的方法,

步骤五:EditText使用场景布局

在使用指定输入法的Activity布局里,添加以下代码

<RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
        <android.inputmethodservice.KeyboardView
            android:id="@+id/keyboard_view"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:background="@color/lightblack"
            android:keyBackground="@drawable/btn_keyboard_key" 
            android:keyTextColor="@color/white"
            android:visibility="gone" />
    </RelativeLayout>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

开发键盘时,遇到以下问题:

1>问题:这里写图片描述
点击的Popup,字体都是白色的,有时是黑色的,和主题有关系,解决方法: 
KeyboardView有一个属性,keyPreviewLayout,即是预览键盘的布局文件,可以自己定义,以TextView 为布局文件的根节点 
2>预览布局文件的Popup 高度太高,如何调整,想调整成方形的: 

KeyboardView有一个属性keyPreviewHeight,即是预览额高度,即可以调整

转自: http://blog.csdn.net/zouchengxufei/article/details/47026945

前段时间改造了公司的安全键盘,是基于Dialog和Button自定义的。也因此借机了解下 Android 平台提供的自定义键盘接口。Keyboard和。很搞笑的是,百度出来自定义Android键盘(与自定义Android输入法不同)的文章千篇一律。这里讲的自定义键盘同公司安全键盘是两种实现方式,不存在泄露公司内部技术的问题!!!不去吐槽别人,楼主秉持只原创和翻译的作风,输出这第50篇博客。相关属性部分是对照官方文档和Demo实践翻译的,若有瑕疵,请见谅。楼主csdn主页请点击flueky专栏。 1、手指在按压不放滑动过程中,预览布局内容跟随键位切换。 解决:通过自定义view的onTouchEvent()方法进行move事件的拦截。修改返回值就可以。当时还想了好半天,没想到就一个返回值的事。事件分发还是得搞明白。 2、在按压最左和最右的位置,预览布局背景切换。 解决:因为这个预览背景在布局文件就已经设置好了,想要修改预览背景图,KeyBoardView并没有提供. android有各种输入法键盘。但 在某些特定场景中,需要自定义键盘布局,例如乱序键盘、输入指定字串的键盘等。在此,以实现输入身份证号的自定义键盘为例,简述android实现自定义软键盘。 1、编写键盘xml布局文件 symbols.xml 其中,android:code=" 按键所对应值的ascii码 "             android:keyL android:horizontalGap="1%p" android:verticalGap="5px" xmlns:android="http://schemas.android.com/apk/res/android"> <Row android:keyWidth=" 近日项目需求,需要做自定义键盘,因为项目对安全性能要求较高,所以摒弃了系统键盘和一系列的第三方键盘,仿照工商银行app的键盘写了一个自定义键盘的demo,因为之前有很多的前辈留下足迹,所以做起来也不是很费力,在这里要感谢所有知识分享者,我不是巨人,我只是知识的搬运工,言归正传,在本demo里面,键盘布局并没有使用xib和storyboard,纯代码布局,至于因为什么。。。。。。我想你懂得!先来看一... 自定义键盘自定义View实现支付密码的输入自定义系统键盘核心:KeyboardView 与自定义键盘文件 xml一起使用实现province_keyboard = new Keyboard(mContext, R.xml.province_abbreviation);number_keyboar = new Keyboard(mContext, R.xml.number_or_letters);... 在一些比较敏感的输入场合,我们不能调用系统的软键盘进行输入信息,这时候就需要自定义一个软键盘来完成输入工作,由此就需要下面 Android 安全软键盘开发 的工作,本文主要从项目需求出发,梳理开发流程,并给出一个实际开发的例子作为参考。 一、Android 安全软键...