Android 自定义输入支付密码的软键盘

有项目需求需要做一个密码锁功能,还有自己的软键盘,类似与支付宝那种,这里是整理的资料,大家可以看下,如有错误,欢迎留言指正

需求:要实现类似支付宝的输入支付密码的功能,效果图如下:

软键盘效果图

使用 android.inputmethodservice.KeyboardView这个类自定义软键盘

软键盘的实现

1. 自定义只输入数字的软键盘 PasswordKeyboardView 类,继承自 android.inputmethodservice.KeyboardView

/**

* 输入数字密码的键盘布局控件。

*/

public class PasswordKeyboardView extends KeyboardView implements

android.inputmethodservice.KeyboardView.OnKeyboardActionListener {

// 用于区分左下角空白的按键

private static final int KEYCODE_EMPTY = -10;

private int mDeleteBackgroundColor;

private Rect mDeleteDrawRect;

private Drawable mDeleteDrawable;

private IOnKeyboardListener mOnKeyboardListener;

public PasswordKeyboardView(Context context, AttributeSet attrs) {

super(context, attrs);

init(context, attrs, 0);

}

public PasswordKeyboardView(Context context, AttributeSet attrs,

int defStyleAttr) {

super(context, attrs, defStyleAttr);

init(context, attrs, defStyleAttr);

}

private void init(Context context, AttributeSet attrs,

int defStyleAttr) {

TypedArray a = context.obtainStyledAttributes(attrs,

R.styleable.PasswordKeyboardView, defStyleAttr, 0);

mDeleteDrawable = a.getDrawable(

R.styleable.PasswordKeyboardView_pkvDeleteDrawable);

mDeleteBackgroundColor = a.getColor(

R.styleable.PasswordKeyboardView_pkvDeleteBackgroundColor,

Color.TRANSPARENT);

a.recycle();

// 设置软键盘按键的布局

Keyboard keyboard = new Keyboard(context,

R.xml.keyboard_number_password);

setKeyboard(keyboard);

setEnabled(true);

setPreviewEnabled(false);

setOnKeyboardActionListener(this);

}

@Override

public void onDraw(Canvas canvas) {

super.onDraw(canvas);

// 遍历所有的按键

List keys = getKeyboard().getKeys();

for (Keyboard.Key key : keys) {

// 如果是左下角空白的按键,重画按键的背景

if (key.codes[0] == KEYCODE_EMPTY) {

drawKeyBackground(key, canvas, mDeleteBackgroundColor);

}

// 如果是右下角的删除按键,重画背景,并且绘制删除的图标

else if (key.codes[0] == Keyboard.KEYCODE_DELETE) {

drawKeyBackground(key, canvas, mDeleteBackgroundColor);

drawDeleteButton(key, canvas);

}

}

}

// 绘制按键的背景

private void drawKeyBackground(Keyboard.Key key, Canvas canvas,

int color) {

ColorDrawable drawable = new ColorDrawable(color);

drawable.setBounds(key.x, key.y,

key.x + key.width, key.y + key.height);

drawable.draw(canvas);

}

// 绘制删除按键

private void drawDeleteButton(Keyboard.Key key, Canvas canvas) {

if (mDeleteDrawable == null)

return;

// 计算删除图标绘制的坐标

if (mDeleteDrawRect == null || mDeleteDrawRect.isEmpty()) {

int intrinsicWidth = mDeleteDrawable.getIntrinsicWidth();

int intrinsicHeight = mDeleteDrawable.getIntrinsicHeight();

int drawWidth = intrinsicWidth;

int drawHeight = intrinsicHeight;

// 限制图标的大小,防止图标超出按键

if (drawWidth > key.width) {

drawWidth = key.width;

drawHeight = drawWidth * intrinsicHeight / intrinsicWidth;

}

if (drawHeight > key.height) {

drawHeight = key.height;

drawWidth = drawHeight * intrinsicWidth / intrinsicHeight;

}

// 获取删除图标绘制的坐标

int left = key.x + (key.width - drawWidth) / 2;

int top = key.y + (key.height - drawHeight) / 2;

mDeleteDrawRect = new Rect(left, top,

left + drawWidth, top + drawHeight);

}

// 绘制删除的图标

if (mDeleteDrawRect != null && !mDeleteDrawRect.isEmpty()) {

mDeleteDrawable.setBounds(mDeleteDrawRect.left,

mDeleteDrawRect.top, mDeleteDrawRect.right,

mDeleteDrawRect.bottom);

mDeleteDrawable.draw(canvas);

}

}

@Override

public void onKey(int primaryCode, int[] keyCodes) {

// 处理按键的点击事件

// 点击删除按键

if (primaryCode == Keyboard.KEYCODE_DELETE) {

if (mOnKeyboardListener != null) {

mOnKeyboardListener.onDeleteKeyEvent();

}

}

// 点击了非左下角按键的其他按键

else if (primaryCode != KEYCODE_EMPTY) {

if (mOnKeyboardListener != null) {

mOnKeyboardListener.onInsertKeyEvent(

Character.toString((char) primaryCode));

}

}

}

@Override

public void onPress(int primaryCode) {

}

@Override

public void onRelease(int primaryCode) {

}

@Override

public void onText(CharSequence text) {

}

@Override

public void swipeLeft() {

}

@Override

public void swipeRight() {

}

@Override

public void swipeDown() {

}

@Override

public void swipeUp() {

}

/**

* 设置键盘的监听事件。

*

* @param listener

* 监听事件

*/

public void setIOnKeyboardListener(IOnKeyboardListener listener) {

this.mOnKeyboardListener = listener;

}

public interface IOnKeyboardListener {

void onInsertKeyEvent(String text);

void onDeleteKeyEvent();

}

}

2. 自定义属性:

values/attrs.xml

3. 软键盘按键的布局文件 res/xml/keyboard_number_password:

说明:

android:keyWidth="33.33333%p":指定按键的宽度,保证键盘的每一列宽度一致

android:keyHeight="8%p":设置键盘的高度

android:horizontalGap="1dp":实现键盘每一列之间的分割线

android:verticalGap="1dp":实现键盘每一行之间的分割线

xmlns:android="http://schemas.android.com/apk/res/android"

android:keyWidth="33.33333%p"

android:keyHeight="8%p"

android:horizontalGap="1dp"

android:verticalGap="1dp">

android:codes="49"

android:keyLabel="1"/>

android:codes="50"

android:keyLabel="2"/>

android:codes="51"

android:keyLabel="3"/>

android:codes="52"

android:keyLabel="4"/>

android:codes="53"

android:keyLabel="5"/>

android:codes="54"

android:keyLabel="6"/>

android:codes="55"

android:keyLabel="7"/>

android:codes="56"

android:keyLabel="8"/>

android:codes="57"

android:keyLabel="9"/>

android:codes="-10"

android:keyLabel=""/>

android:codes="48"

android:keyLabel="0"/>

android:codes="-5"

android:keyIcon="@mipmap/keyboard_backspace"/>

3. 在布局中引用软键盘控件:

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#b0b0b0"

android:focusable="true"

android:focusableInTouchMode="true"

android:keyBackground="#ffffff"

android:keyTextColor="#000000"

android:shadowColor="#00000000"

android:shadowRadius="0"

app:pkvDeleteBackgroundColor="#d2d2d2"

app:pkvDeleteDrawable="@drawable/keyboard_backspace" />

随机数字键盘的实现

目前能想到的有两种实现方式:

1. 在 onDraw 方法里重新绘制键盘上的文字,覆盖掉原来的键盘,这种实现方式相对比较麻烦。

2. 调用 KeyboardView.setKeyboard() 方法重新设置键盘,实现的代码如下:

// 0-9 的数字

private final List keyCodes = Arrays.asList(

'0', '1', '2', '3', '4', '5', '6', '7', '8', '9');

/**

* 随机打乱数字键盘上显示的数字顺序。

*/

public void shuffleKeyboard() {

Keyboard keyboard = getKeyboard();

if (keyboard != null && keyboard.getKeys() != null

&& keyboard.getKeys().size() > 0) {

// 随机排序数字

Collections.shuffle(keyCodes);

// 遍历所有的按键

List keys = getKeyboard().getKeys();

int index = 0;

for (Keyboard.Key key : keys) {

// 如果按键是数字

if (key.codes[0] != KEYCODE_EMPTY

&& key.codes[0] != Keyboard.KEYCODE_DELETE) {

char code = keyCodes.get(index++);

key.codes[0] = code;

key.label = Character.toString(code);

}

}

// 更新键盘

setKeyboard(keyboard);

}

}

调用 shuffleKeyboard 即可生成随机的键盘。

最终实现的效果如下:

随机键盘

踩坑

1. 点击按键的放大镜效果提示

软键盘默认点击按键时会显示放大镜效果的提示,如果不需要可以使用 setPreviewEnabled(false) 设置不显示提示。

可以在布局中使用 android:keyPreviewLayout 指定提示文字的布局。

2. 按键文字不清晰

软键盘按键默认带有阴影效果,会导致文字不清楚,可以使用下面方式去掉阴影:

android:shadowColor="@color/transparent"

android:shadowRadius="0"

...

/>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

android自定义金额输入键盘_Android 自定义输入支付密码的软键盘实例代码相关推荐

  1. android自定义金额输入键盘_Android自定义软键盘的实现

    先看界面布局文件 android:layout_width="fill_parent" android:layout_height="fill_parent" ...

  2. android银行卡输入密码,android 仿微信添加银行卡时输入支付密码

    最近了解到了BottomSheetBehavior,感觉是个很有意思的布局,刚好项目中有实际场景可以应用,就拿它来实现了,下面是我们要实现的最终效果: gif.gif 底部的键盘布局呢,就是采用的Bo ...

  3. android自定义金额输入键盘_Android 自定义控件 - 仿支付宝数字键盘

    原标题:Android 自定义控件 - 仿支付宝数字键盘 简介 在一些带有支付功能的 App 中,输入的密码一般只能是纯数字,虽然我们可以指定 EditText 输入框只能输入数字,但是为了提供用户的 ...

  4. vue输入支付密码调起键盘功能

    直接上Demo <template><div><div @click="jump">点击付款</div><div class= ...

  5. android 对话框焦点获取_android edittext 获取焦点并弹出软键盘

    Oracle 表和表数据恢复 1. 表恢复 对误删的表,只要没有使用 purge 永久删除选项,那么基本上是能从 flashback table 区恢复回来的. 数据表和其中的数据都是可以恢复回来的, ...

  6. uniapp 密码支付,多样式支付,数字密码,支付密码,数字键盘,多样自定义支付组件,可以根据用户需求调节支付样式,总共八中组合满足大多数需求,真正的开箱即用

    插件链接:https://ext.dcloud.net.cn/plugin?id=2591 作者说 开发不易,如果帮助到你的,请支持 有问题请留言,作者会积极更新 使用方法 # 基础用法 复制代码 & ...

  7. android 动态画直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...

    本文讲述了Android使用自定义view在指定时间内匀速画一条直线的实例代码.分享给大家供大家参考,具体如下: 1.效果图: 2.自定义view实现 public class UniformLine ...

  8. android 动态生成直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...

    本文讲述了Android使用自定义view在指定时间内匀速画一条直线的实例代码.分享给大家供大家参考,具体如下: 1.效果图: 2.自定义view实现 public class UniformLine ...

  9. JavaScript - 模拟键盘输入支付密码

    JavaScript - 模拟键盘输入支付密码 Max.Bai 2016-12-29 0x00: 发生了什么事 我做自动化测试的时候,需要自动化在页面上输入这个密码,什么样子的,看下面: 有没有很像支 ...

最新文章

  1. codeforces数学1600day4[贪心数学公式推导CodeForces - 1151D ,思维CodeForces - 1085C,数论同余+组合计数 CodeForces - 1056B]
  2. AAAI 2021放榜:你中了几篇?
  3. admui 能再php上用吗,Javascript 方法
  4. 人脸识别可以分辨同性恋?论科技研发和伦理道德之间的矛盾
  5. 留学申请中,你们怎么老让我做科研啊?
  6. 漫画:什么是动态规划?(整合版)
  7. 黄章“官宣”魅族17系列:骁龙865加持 不止一个版本
  8. 源码:Hadoop-2.7.4 启动过程中执行start-all.sh开始
  9. 能改变原生web前端元素样式的water.css
  10. CF991D Bishwock
  11. Knockout开发中文API系列1
  12. python 删除文件到回收站 SHFileOperation
  13. vue图片压缩不失真_vue中实现图片压缩 file文件的方法
  14. 威联通 php升级,威联通折腾篇十七:Docker 安装的 NextCloud 升级、备份及恢复
  15. 基2FFT的matlab实现
  16. 通过Fiddler进行抓包并分析
  17. Linux命令·chmod
  18. 019基于脑电图信号和CNN的癫痫发作检测2018
  19. 微信小程序几个空判断整理
  20. 0.60.0以上ract-native tab 报错: RNCViewPager was not found in the UIManager?

热门文章

  1. 拓展 NLog 优雅的输送日志到 Logstash
  2. 修复迁移后Net Standard项目中的错误
  3. .NET Core 2.1 Preview 2发布 - April 10, 2018
  4. 腾讯游戏使用Microsoft Service Fabric案例
  5. php面试题2018
  6. [转]再见 NoSQL!
  7. Chrome 双击关闭标签,新窗口打开新地址,一个插件搞定,安装方便,自带hosts
  8. 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)
  9. 【ArcGIS风暴】在ArcGIS中实现将一个圆16等分
  10. linux之uniq命令