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,一经查实,立即删除!

相关文章

一阶广义差分模型_广义差分法的eviews软件实现

广义差分法的eviews软件实现 1,计量经济学,第六章 自 相 关,2,引子t检验和F检验一定就可靠吗,研究居民储蓄存款 与居民收入 的关系 用普通最小二乘法估计其参数,结果为 (1.8690) 0.0055 14.9343 64.2069,3,检验结果表明回归系数的标准误差非常小,t 统计量…

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

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

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

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

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

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

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

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

hal库开启中断关中断_stm32的HAL库开发学习笔记之外部中断

外部中断中断线————EXTI线0~15(对应外部IO口的输入中断)每个IO口都可以作为外部中断输入每个中短线可以独立的配置触发方式(上升沿,下降沿,双边沿),触发/屏蔽,专用状态位。GPIO与中断线映射关系EXTI0->PA0,PB0,PC0,……PI0…

kindle的xray怎么用_Xray使用的一些经验分享

前言xray被动扫描器,是我目前个人挖洞过程中,感觉最好用的一款扫描器。这篇博客,分享一下我使用xray的一些小心得吧官方github:https://github.com/chaitin/xray官网文档:https://xray.cool/xrayburp的使用普通使用配置…

字符串属于python有序序列、支持双向索引_字符串属于Python有序序列,和列表、元组一样都支持双向索引。...

【多选题】框架梁上部纵筋包括哪些( )【单选题】钢筋半圆弯钩的长度应为下列哪项。【单选题】检验蔬菜质量的主要指标是【判断题】新鲜鳓鱼初加工时要去鳞,因为鳓鱼腥味较大【判断题】低级格式化可以彻底消除硬盘坏道,使硬盘重获新生。【单选题】.鲜草菇呈____色,以菌苞未破,呈…

移动设备 (Android),How-To Geek正在寻找专注于移动设备(Android,iOS,可穿戴设备等)的作家 | MOS86...

随着移动技术的发展和扩展,我们的覆盖范围也在不断扩大。 我们正在寻找经验丰富,专业和知识渊博的自由作家,以帮助将我们的移动内容提高到一个新的水平。我们正在寻找经验丰富的作家来帮助报道有关移动技术的新闻和社论解说。 理想的人选将精…

sh执行文件 参数传递_Shell脚本传参数方法总结

一、接收固定长度的参数[rootsvn shell_example]# cat params.sh#!/bin/bash#传参测试脚本echo "My name is basename $0 -I was called as $0"echo "My first parameter is : $1"echo "My second parameter is : $2"空参数执行[rootsvn shell_e…

android mdpi对应哪一个屏幕,android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配...

1 Android手机目前常见的分辨率1.1 手机常见分辨率:4:3VGA 640*480 (Video Graphics Array)QVGA 320*240 (Quarter VGA)HVGA 480*320 (Half-size VGA)SVGA 800*600 (Super VGA)5:3WVGA 800*480 (Wide VGA)16:9FWVGA 854*480 (Full Wide VGA)HD 1920*1080 High D…

datatable筛选条件_C#利用DataView的RowFilter对DataTable进行查询筛选

1、筛选某个字段满足指定条件的记录DataView dv myDs.Tables[0].DefaultView;dv.RowFilter "Year1427";gv.DataSource dv;Year这个是myDs.Tables[0]的一个字段。这样就是只有Year的值等于1427的记录绑定gv控件。2、用RowFilter对指定列进行模糊匹配我们都知道sql语…

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

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

csp怎么给线条描边_PS的四种“描边”方式你都知道吗?Photoshop小知识

1.编辑描边基于位图的运算描边方式在画布里输入需要的文字,对图层单击右键,选择“栅格化文字”。选择顶栏的编辑菜单,选择“描边”,弹出描边对话框后调节粗细、颜色和描边位置,点击“确认”即可。从一些细节我们可以看…

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

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

两个质数互质是_科学网—理解黎曼猜想(二)两个自然数互质的概率是多少? - 袁岚峰的博文...

导读:任选两个自然数,它们互质的概率是多少?它就是s 2时欧拉乘积公式右边的连乘的倒数,因此它等于s 2时欧拉乘积公式左边的连加的倒数,即1/ζ(2)。而ζ(2) π^2/6,因此这个概率等于6/π^2 ≈ 60.79%。同…

修改计算机用户权限,如何修改一个电脑账户为最低权限

使用Administrator管理员账户,且不能删除。①在登录的欢迎屏幕显示Administrator账户的方法: 单击“开始→运行”,输入regedit后回车,打开注册表编辑器,依次展开“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\C…

一副眼镜一千多贵吗_央视曝光!一副眼镜上千元,出厂价却只要几十元

原标题:央视曝光!一副眼镜上千元,出厂价却只要几十元眼镜行业历来让人觉得非常“暴利”,那么一副眼镜生产成本究竟是多少呢?据央视财经《正点财经》报道,一副眼镜的出厂价只需几十元。江苏丹阳:…

vue图片时间轴滑动_vue时间轴风格式的图片展示

项目将近完结,在修正bug的同时,也对自己项目中代码进行回顾分析。看回半年前写的东西,真是很多都感到陌生,所以趁着下午的空档时间总结下之前遇到的难点。好的,先上图,目标效果先分析上下两层,上…