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

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"

...

/>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IE6 IE8下背景图片不显示问题

更改background:url()no-repeat; 去掉no-repeat即可解决问题!转载于:https://www.cnblogs.com/dream-w/p/4781644.html

C# 选中 DataGridView 控件中的行时显示不同的颜色

可以利用 DataGridView 控件的 SelectionMode、ReadOnly 和 SelectionBackColor 属性实现当选中DataGridView控件中的行时显示不同的颜色。SelectionMode属性用于设置如何选择 DataGridView 的单元格。语法如下:public DataGridViewSelectionMode SelectionMode{get;set;}属性值…

Objective-C( Foundation框架 一 常见的结构体)

常见的结构体 (NSPoint,CGPoint)、(NSRange,CGRange)、(NSSize,CGSize) 苹果官方推荐使用CG开头的结构体 NSRange是Foundation框架中常见的结构体它的定义如下&#xff1…

32岁武汉硕士毕业4年后重新高考,考上本硕需再读8年:“不是一时冲动”

全世界只有3.14 % 的人关注了爆炸吧知识9月5日,程传坤收到了湖北中医药大学的录取通知书。7月8日下午5时10分,32岁的程传坤走出湖北省武汉市新洲一中考点,一脸轻松,拿着准考证特意在新洲一中门前留影。这是他硕士毕业4年后再战高考…

打开本地文件_可以跨软件搜索文件?结构式检索你一定要学会!

面对电脑中日积月累的大量结构式,如何能快速找到自己想要的文件,有时真是一个让人头疼的问题。KingDraw PC版内置的结构式检索功能,可以帮助我们轻松解决这个难题。KingDraw PC版中,我们有两种途径可以检索结构式——右键菜单中检…

C# static readonly 与 const 的区别

static readonly 与 const 的区别: const 表达式的值是在编译时形成的; static readonly 表达式的值直到程序运行时才形成;转载于:https://www.cnblogs.com/xiangfeideshui/archive/2012/10/15/2724260.html

WPF实现雷达图(仿英雄联盟)

WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织转载 有小伙伴提出需要实现雷达图。 由于在WPF中没有现成的雷达图控件,所以我们自己实现一个。PS:有更好的方式欢迎推荐。01—代码如…

Emoji:搜索将与您找到表情符号背后的故事

眼下。秉已经开始支持emoji搜索,这意味着,你可以插入或粘贴系列emoji表情,让我们的爱、微笑、食品等。。些表情随意组合,必应总会带给你非常多有趣的但却没有不论什么实际用途的搜索结果。这是一项非常新鲜的东西,并且…

python3 2.00gb怎么去掉单位_最值得期待的Python 3.9的新功能

Python 3.9 beta预计下个月就要发布了,那么3.9有那些让我们期待的新功能和变更呢?本我我们一起来说Python 3.9的新功能的。安装测试版为了能够实际探索Python 3.9 的功能,我们需要先下载一个Python 3.9 alpha/beta并安装。wget https://www.p…

TSQL语句中的Like用法

SQL Server:SQL Like 的特殊用法 %:匹配零个及多个任意字符; _:与任意单字符匹配; []:匹配一个范围; [^]:排除一个范围 SymbolMeaninglike 5[%]5%like [_]n_nlike [a-cdf]a, b, c, d…

C++ virtual笔试

一直在赶场&#xff0c;下面是出了N次的题... 当基础看了 #include <iostream> using namespace std; namespace Torxie { // class CFirst { public: void func() { cout<< "CFirst"&l…

这6部超经典的物理电影,居然还有人没有看过?

全世界只有3.14 % 的人关注了爆炸吧知识开篇警告&#xff1a;这是一篇福利文&#xff01;今天小编给热爱物理及数学的小伙伴们&#xff0c;分享6部豆瓣评分8分以上&#xff0c;与数学和物理领域相关的经典电影&#xff0c;帮助大家在工作、学习之余劳逸结合。这些影片除了涉及数…

产品说,我只需要一个有亿点复杂的查询界面

有的时候&#xff0c;你需要动态构建一个比较复杂的查询条件&#xff0c;传入数据库中进行查询。而条件本身可能来自前端请求或者配置文件。那么这个时候&#xff0c;表达式树&#xff0c;就可以帮助到你。本文我们将通过几个简短的示例来了解如何完成这些操作。你也可能接到过…

PostgreSQL忘记输入where条件update更新整张表的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 虽然出现这个错误很挫&#xff0c;但有时候还是会被你或者你的同事碰到。为了避免这个错误&#xff0c;PostgreSQL数据库中可以通过触发器来解决&#xff0c;这里用的是plpgsql 。 1、修改postgresql.conf配置 增加&…

视觉开发需要什么程度的数学_角度的概念在视觉上非常直观,但其数学定义并不是那么简单...

角的概念是几何学中最基本的概念之一。当我们研究三角形的性质时&#xff0c;我们自然地建立了三角形的边和角之间的联系。这些联系是在三角学中系统地建立起来的。角是什么&#xff1f;我们如何测量它&#xff1f;虽然角度的概念在视觉上很直观&#xff0c;但它的数学定义却不…

轻松搭建Google ADK开发环境

相信很多网友一直有自己DIY机器人的想法&#xff0c;但苦于要使用的各种控制模块品种繁多、成本高昂、且开发难度较高。但是随着Google发布了任何人均可自由开发Android终端外设的协议“Open Accessory Protocol”后&#xff0c;大家可以利用Android手机上的丰富资源以及完善的…

搭建nginx + python + django +memcached+ mysql +fastcgi 环境

Django是一个开放源代码的Web应用框 架,由Python写成,它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。pythondjango也是web开发者最受欢 迎的框架.今天记录下整个搭建开发环境的过程.(说明下环境的系统为 centos 5.2) 一:更新yum仓库(目前这个yu…

别薅了别薅了!!!再薅就真的被薅秃了!!

▲ 点击查看大家好&#xff0c;超模全新的固定栏目「薅羊毛」上线了&#xff01;既然是薅羊毛&#xff0c;怎么能空着手来&#xff1f;毕竟好用的好吃的&#xff0c;啥都要花钱。与其为那些虚幻的包装价值买单&#xff0c;不如跟着超模君狠狠地薅一把羊毛&#xff0c;「花小钱赚…

GitHub Universe 2021|MS Reactor 邀你共聚年度盛会

关注我们GitHub Universe 2021 将于2021年10月27-28日&#xff08;PDT&#xff09;在线直播&#xff0c;MS Reactor 将与 CSDN 合作进行转播&#xff0c;与你一同观看这场全球开发者盛会。 关于 GitHub UniverseGitHub Universe 是 GitHub 面向全球开发者社区举办的年度重要盛会…

C#中的多线程 - 并行编程 z

原文&#xff1a;http://www.albahari.com/threading/part5.aspx 专题&#xff1a;C#中的多线程 1并行编程Permalink 在这一部分&#xff0c;我们讨论 Framework 4.0 加入的多线程 API&#xff0c;它们可以充分利用多核处理器。 并行 LINQ&#xff08;Parallel LINQ&#xff09…