Android自定义view实现输入控件
作者:Hello_GoodBey 发布时间:2022-12-11 10:08:06
标签:Android,view,输入控件
本文实例为大家分享了Android自定义view实现输入控件的具体代码,供大家参考,具体内容如下
网络上大部分的输入控件都是多个EditText组合而成,本例中采用的是:
单个EditText作为输入的捕捉控件
多个ImageView的子类作为显示的控件,绘制EditText中的数据
如上图:
输入前和输入后输入框需要发生响应的改变
点击自定义控件要弹出软键盘
EditText数据捕捉,以及EditView不能操作(如果可以操作,数据处理会混乱)
输完后会得到相应的提示
ImageView的子类可以设置宽高,字体大小颜色,以及两个View之间的间隔
那么代码走起:
首先是ImageView的子类TextImageView,onDraw的实现也很简单,就是判断text是否长度大于0,如果大于0则绘制文字,还有一些细节处理就是设置字体颜色,字体大写,获取字体的宽高
@Override
protected void onDraw(Canvas canvas) {
if (text.length() > 0) {
if (isDrawSrc) {
super.onDraw(canvas);
}
canvas.drawText(text, 0, text.length(), (getMeasuredWidth() - textWidth) / 2, (getMeasuredHeight() + dy) / 2, textPaint);
} else {
super.onDraw(canvas);
}
}
其次PasswordView是一个自定义ViewGroup,引入了一个布局,布局中就是一个EditText(数据捕捉)和一个Linearlayout(代码添加TextImageView)。EditText的宽高是1dp和0dp(避免用户可以操作EditText);给Linearlayout设置divider属性(两个TextImageView的间隔)
PasswordView的核心代码如下:
- 代码控制EditView获取输入
public void requestEtFocus() {
catchInput.setFocusable(true);
catchInput.setFocusableInTouchMode(true);
catchInput.setClickable(true);
catchInput.requestFocus();
showSoftKeyboard(catchInput);
catchInput.setCursorVisible(false);
catchInput.setSelection(catchInput.length());
}
// 动态添加TextImageView
for (int i = 0; i < passwordLength; i++) {
TextImageView view = new TextImageView(context);
view.setTextSize(textSize);
view.setTextColor(textColor);
content.addView(view);
if (unInputBg != 0) {
view.setBackgroundResource(unInputBg);// 设置未输入前的背景
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int) itemWidth, (int) itemHeight);
if (i == 0) {
params.setMargins((int) dpToPixel(1), 0, 0, 0);
}
if (i == passwordLength - 1) {
params.setMargins(0, 0, (int) dpToPixel(1), 0);
}
view.setLayoutParams(params);
views[i] = view;
// 分割字体,给TextIamgeView绘制文字
if (text != null && i < text.length()) {
setItemText(text.subSequence(i, i + 1));
}
}
// 输入监听
catchInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() > 0) {
// index:成员变量;保存当前的输入了几个字符
if (index > s.length()) {
removeItemText();// 删除
} else {
setText(s);
if (s.length() == passwordLength) {
if (listener != null) {
// 输入完成回调
listener.onInputCodeEnd(s);
}
}
}
} else if (s.length() == 0 && index > 0) {
removeItemText();
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
实现比较简单,大多都是一些细节处理,具体看源码:PasswordView
来源:https://blog.csdn.net/Hello_GoodBey/article/details/80223485


猜你喜欢
- 前言前几天多名用户反馈同一个问题,在小新平板上无法上网课,点击上课按钮后就退回到首页了。同事了解了一下发现小新平板现在销量特别好,于是赶紧申
- 一、概述从3.1版本起,Spring框架就已经支持将缓存添加到现有的Spring应用中,和事务支持一样,缓存抽象允许在对代码影响最小的情况下
- 1、判断实体对象是否为空2、判断对象所有属性是否为空3、特别注意,实体类中如果有基本数据类型,会影响判断package com.liuxd.
- 前言之前看到某公司的官网的文章的浏览量刷新一次网页就会增加一次,给人的感觉不太好,一个公司的官网给人如此直白的漏洞,我批量发起请求的时候发现
- 一、什么是CharacterEncodingFilter官方解释如下是spring内置过滤器的一种,用来指定请求或者响应的编码格式。在web
- 背景笔者使用 Spring Security 5.8 时,发现网上很多教程所教的 Spring Security 配置类 SecurityC
- 可以静态绑定数据源,这样就自动为DataGridView控件添加 相应的行。假如需要动态为DataGridView控件添加新行,方法有很多种
- 本文实例为大家分享了Java 1.8使用数组实现循环队列的具体代码,供大家参考,具体内容如下1、引入使用数组实现循环队列,功能如下:1)is
- 目录单一职责原则接口隔离原则开闭原则里氏替换原则依赖倒置原则迪米特法则笔者作为一个菜鸟,会尝试以简单的代码和容易理解的语句去解释这几种原则的
- 目录前言整合swagger api自定义配置信息简单使用Swagger常用注解Api标记ApiOperation标记ApiParam标记Ap
- 本文实例为大家分享了Android设置默认锁屏壁纸接口的具体代码,供大家参考,具体内容如下完成自定义service后,接下来就是具体实现接口
- string filePath = @"E:\Randy0528\中文目录\JustTest.rar"; &n
- 前言文件上传是项目开发中最常见的功能之一 ,SpringMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配Multi
- 在了解ViewPager的工作原理之前,先回顾ListView的工作原理:ListView只有在需要显示某些列表项时,它才会去申请可用的视图
- 本篇文章所涉及到的demo练习 使用的cloud 2021.0.3+ springboot2.6.8一、概述简介官网:https://doc
- 一.前言RabbitMQ的TTL全称为Time-To-Live,表示的是消息的有效期。消息如果在队列中一直没有被消费并且存在时间超过了TTL
- 本文实现案例场景: 某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定
- 最近制作了一个多屏幕的项目,多屏幕指的是一个电脑主机,连接多个显示器。我这个项目使用了一个显卡连接了三个显示设备。Unity UGUI提供C
- 前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo
- using System.Drawing;using System.Drawing.Drawing2D;using System.Drawi