android确认密码代码,Android自定义View实现验证码or密码输入框

前言

最近项目中有支付功能,用户输入密码时要类似微信支付密码输入框的样式,本想直接copy网上的,但设计姐姐总是对样式挑三拣四,抽空自己自定义了一个,无奈之下抽空自定义了个,并把它贴到GitHub上供网友们参考。

示例

废话不多说,先看效果图。

c47768be3dfd?utm_campaign

number-input-video.gif

实现

BorderTextView

首先,实现这种效果我用多个TextView控件组合,为什么是TextView呢,因为我不仅需要文字大小颜色等可以定制,还要文字的背景色,背景框等可以变化。但系统的TextView设置背景过于单一,假如我要带圆角的背景,甚至是圆角可以变化的背景,这就麻烦了。因此我继承TextView自定义了BorderTextView。

BorderTextView控件主要是文字的背景色可变化,有边框和填充两种背景。

边框的粗细、颜色、圆角均可定制。

填充背景时,填充颜色,背景圆角可定制。

除此之外,BorderTextView有明文显示和密文显示两种模式。考虑过设置transformationMethod属性来将TextView显示成"●",但有时候设置的"●"太小了,而且颜色又单一,因此我重写了TextView的setBackgroundColor方法,在文字的中心化了个实心圈覆盖文字,同时"●"的颜色大小均可变化。

核心代码如下

override fun onDraw(canvas: Canvas) {

mStrokePaint.isAntiAlias = true

mStrokePaint.strokeWidth = strokeWidth.toFloat()

mStrokePaint.color = strokeColor

mStrokePaint.style = if (isFill) Paint.Style.FILL else Paint.Style.STROKE

mStrokePaint.strokeCap = Paint.Cap.ROUND

//解决canvas.drawRoundRect时,四个圆角线较粗问题

if (rectF == null) {

val d = strokeWidth / 2

rectF = RectF(d.toFloat(), d.toFloat(), (measuredWidth - d).toFloat(), (measuredHeight - d).toFloat())

}

if (mBgPaint != null) {

canvas.drawRoundRect(rectF!!, cornerRadius.toFloat(), cornerRadius.toFloat(), mBgPaint!!)

}

canvas.drawRoundRect(rectF!!, cornerRadius.toFloat(), cornerRadius.toFloat(), mStrokePaint)

if (mIsPassWordMode && text.isNotEmpty()) {

mDotPaint.style = Paint.Style.FILL

mDotPaint.color = textColors.defaultColor

val xy = measuredWidth / 2.toFloat()

canvas.drawCircle(xy, xy, textSize / 2, mDotPaint)

}

super.onDraw(canvas)

}

EditText

EditText用于监听用户输入的数字,将其的背景设置成透明,再设置 isCursorVisible = false、inputType = InputType.TYPE_CLASS_NUMBER 属性。同时,用户输入的时候需要拦截输入内容,再将内容显示到BorderTextView上。监听用户键盘的KeyEvent.KEYCODE_DEL事件用户处理输入内容的删除

搞定BorderTextView和EditText后就简单了,用List集合存储TextViews,创建LineaLayout将N个TextView添加过去,调整其位置就ok了。

/**

* 初始化EditText

*/

private fun initEditText() {

mEditText = EditText(context)

mEditText.let {

it.setBackgroundColor(Color.TRANSPARENT)

it.isFocusable = true

it.isCursorVisible = false

it.inputType = InputType.TYPE_CLASS_NUMBER

}

}

/**

* 监听删除键

**/

mEditText.setOnKeyListener { v, keyCode, event ->

if (keyCode == KeyEvent.KEYCODE_DEL && event.action == KeyEvent.ACTION_DOWN) {

if (mInputSb.isNotEmpty()) {

mInputSb.delete(mInputSb.length - 1, mInputSb.length)

mTextViews[mInputSb.length].text = ""

return@setOnKeyListener true

}

}

return@setOnKeyListener false

}

自定义属性

name

说明

format

默认值

niv_text_size_sp

输入框字体大小

integer

16

niv_text_color

输入框字体颜色

color

#333333

niv_text_divider

输入框间隔

dimension

5

niv_text_width

输入框宽度(width=height)

dimension

40

niv_border_width

输入框边框宽度

dimension

2

niv_border_color

输入边框颜色

color

#333333

niv_border_radius

输入框圆角角度

dimension

4

niv_is_fill

是否填充输入框

boolean

false

niv_count

输入框个数(最大为10)

integer

6

niv_is_pw_mode

输入数字是否用点代替

boolean

false

可用方法

method_name

description

return type

setInputCompleteListener(inputCompleteListener: InputCompleteListener)

输入完成时监听

Unit

使用示例

上示例图中xml代码如下

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

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

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center"

android:orientation="vertical"

android:paddingBottom="20dp"

android:paddingTop="20dp"

tools:context="com.neworin.sample.MainActivity">

android:id="@+id/sample_niv1"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

app:niv_count="4"

app:niv_is_fill="false"

app:niv_text_size_sp="18"/>

android:id="@+id/sample_niv2"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

app:niv_border_color="@color/colorPrimaryDark"

app:niv_border_radius="0dp"

app:niv_count="5"

app:niv_text_color="@color/color_red"/>

android:id="@+id/sample_niv3"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

app:niv_border_color="@color/input_layout_bg"

app:niv_border_radius="0dp"

app:niv_count="6"

app:niv_is_fill="true"

app:niv_text_size_sp="20"/>

android:id="@+id/sample_niv4"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

app:niv_count="6"

app:niv_is_pw_mode="true"

app:niv_text_color="@color/colorPrimary"

app:niv_text_size_sp="18"/>

效果图

c47768be3dfd?utm_campaign

效果图

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

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

相关文章

华为鸿蒙再次公测,华为鸿蒙开启第二轮公测,新增7款机型,有你的吗?

原标题:华为鸿蒙开启第二轮公测,新增7款机型,有你的吗?华为鸿蒙操作系统,相信这是很多人都非常期待的操作系统,这个操作系统经过各方评测之后,得到的反馈都要远比华为此前所搭载的基于安卓开发的…

同行不支持鸿蒙系统,鸿蒙系统虽好,但也需要国内同行支持

原标题:鸿蒙系统虽好,但也需要国内同行支持鸿蒙系统将在不久正式推出,但是鸿蒙系统虽好,但也离不开国内同行的支持。鸿蒙系统的细节透露后,被广大数码爱好者所重视。作为一款不同于苹果IOS以及安卓系统外的其他手机系统…

linux主机开放ftp、http服务_Linux系统与Windows系统哪个好呢(一)

当Windows与Linux作为VPS云主机操作系统的对比时,需要专注于小企业主最相关的因素,一个明显的赢家出现了,现在我们来看看吧。Linux与Windows的比较:任何虚拟主机操作系统都应该快速且稳定,但当企业选择VPS主机时&#…

国内厂商对鸿蒙系统的态度,鸿蒙系统4月上线,国内手机厂商态度很关键!小米、中兴出乎意料...

前段时间,华为举行了新品发布会,在这个发布会上,华为宣布了两件事情,第一就是华为全新的折叠屏手机Mate X2正式亮相了,而第二件事情更加让人惊喜,余承东已经确认,华为的鸿蒙系统将会在4月份上线…

用linq查询html中div个数,C#使用Linq to XML进行XPath查询

最近在用到HtmlAgliltyPack进行结点查询时,发现这里选择结点使用的是XPath。所以这里总结一下在C#中使用XPath查询XML的方式。习惯了用Linq,这里也是用的Linq to xml的。Linq To XML的核心类是XDocument和XElement、XAttribute,下面简单介绍一…

学编导还是学计算机,高二学编导烧钱吗

高二学编导烧钱吗2019-09-22 10:34:23文/马妍高二学编导还是很费钱的。艺术专业的学习普遍都很贵,学编导总体需要3-6万元左右。一般培训班要两到三万,还需要购买一些专业的设备,费用也不低。编导专业简介编导有广义和狭义之分,狭义…

用计算机录制一段30,测评!电脑录屏软件哪个好用?小白进阶第1阶段

原标题:测评!电脑录屏软件哪个好用?小白进阶第1阶段电脑录屏软件哪个好用?最近短视频越来越火,小卓发现身边不少人都在捣鼓视频,有拍摄的有录屏的比比皆是。问了一下,大多是对此感兴趣的&#x…

java word 转换 图片_怎样把手机上的图片转换成word?

在当今这个快速发展的时代,人手一部手机是件很正常的事,小编的手机上往往会存有许多喜欢的文字图片,可是那么多的图片又会占用很多手机的空间,这样就有些不好了。庆幸的是最近小编学习到一个可以将手机上的图片转化成文字的技巧&a…

uic计算机科学与技术,北京师范大学-香港浸会大学联合国际学院UIC理工科技学部高招网...

马真真计算机科学与技术专业,现于美国南加州大学攻读硕士学位想想当初报考UIC的时候是冲着网上一个学长说的“如果你想要学习,那么来UIC绝对不会后悔”,现在毕业了,发现,确实如此。四年,学习了方方面面的知识&#xff…

应付账款账龄分析模板_6万字长文剖析宁德时代(三):财务分析

本文为《6万字长文剖析宁德时代》的第三篇。本文来自微信公众号: 凯昇资本(ID:gh_9c57a4031683),头图来自:视觉中国在《6万字长文剖析宁德时代(一):核心技术》和《6万字长文剖析宁德时代(二):市场分析》中我…

开发db文件_Swoole高效跟传统的web开发有什么区别?life

一、swoole的运行模式Swoole高效跟传统的web开发有什么区别,除了传统的LAMP/LNMP同步开发模式,swoole的异步开发模式是怎么样的。我的官方群点击此处。获取更多的swoole学习资料以及视频源码笔记。程序猿的生活:面试12家公司,收获…

计算机设备操作与讲解,计算机组成与操作系统简介

计算机的五大组成部分控制器、运算器、存储器、输入设备、输出设备控制器:是计算机的指挥系统,负责控制计算机其他硬件的工作运算器:负责数学运算与逻辑运算控制器运算器CPU》人的大脑存储器内存优点:存取速度快缺点:断…

360网络修复工具_Win10网络图标不见了解决方法

经常有网友反馈,电脑桌面右下角的网络图标不见了,有时候想要对网络进行相关设置,而找不到入口。下面以最新的系统为例,谈谈Win10网络图标不见了的原因与解决办法。Win10网络图标不见了怎么办?如果仅仅是桌面右下角找不…

计算机课中初中一年级学生特点分析,初中信息技术说课稿:计算机的组成

初中信息技术说课稿《计算机的组成》首先非常感谢我们学校我这个机会,今天能和全镇的信息技术权威坐到一起,我感到无比的荣幸。下面我将从以下8个方面来阐述我的这节课,不当之处,还请各位专家多多批评指正。一、教材分析计算机是初…

c语言使用未初始化的内存怎么解决_C语言快速入门——数组与调试进阶

由ASCII码表的输出程序,我们可以认识到使用循环语句处理一组连续的数据有着巨大的优势。在更普遍的情况下,数据由一组离散的数值组成,如一组学生的考试成绩。对于这些数据的处理,有效的方式是使用循环。但前提是数据可以在循环中有序的访问。ASCII码表输出程序中,循环变量…

从全职高手开始的系统_动画全职高手第二季热血回归,腾讯视频的国漫IP全链路开发之道...

这个国庆档,国产动画在内容市场上的存在感比想象中更加有分量。电影市场上,动画IP电影《姜子牙》完成票房领跑,掀起观影热潮;动画番剧市场上,头部IP动画《全职高手》第二季时隔三年重磅回归——“这是在过年&#xff0…

海南大学计算机调剂要求,海南大学2020年硕士研究生招生调剂的公告

医学教育网小编在海南大学的研究生院官网上查阅到了“海南大学2020年硕士研究生招生调剂的公告”,为帮助各位想要报考海南大学的考生了解,医学教育网小编整理通知内容如下:根据2020年全国硕士研究生招生考试考生进入复试的初试成绩基本要求(国…

计算机上面mac怎么查看,怎么看电脑的mac地址

电脑上网之后,特别是组建了局域网之后,为了防止arp攻击等网络问题,可能会有在路由器上设置物理网卡绑定ip地址的设置。但是,怎么看电脑的mac地址呢?小编带来了具体的操作过程,下面大家跟着学习啦小编一起来学习一下吧…

hbase 查询固定条数_HBase原理深入

HBase读数据流程HBase读数据流程.pngHBase元数据信息.pngHBase读操作首先从zk中找到meta表的region信息,然后meta表中的数据,meta表中存储了用户的region信息根据要查询的namespace、表名和rowkey信息,找到对应的真正存储要查询的数据的regio…

win10 没有计算机策略,Win10家庭版没有组策略怎么办?Win10家庭版打开组策略方法...

Win10主要分为专业版、家庭版和企业版三个版本,其中大多数普通用户用的基本是专业版或家庭版。其中Win10家庭版中并不包含组策略,这意味着对于使用家庭版用户来说,无法借助组策略来优化维护系统。那么,Win10家庭版没有组策略怎么办…