一、需求问题

网上开源的是构建同等数量的EditText,这种存在很多缺陷,主要如下

1、数字/字符键盘切换后状态无法保存

2、焦点切换无法判断

3、光标位置无法修正

为了解决上述问题,使用TextView实现输入框,需要解决的问题是

1、允许TextView可编辑输入

2、修改onDraw实现

效果如下

二、使用TextView 实现输入框

public class EditTextView extends TextView implements TextWatcher {

private final int INPUT_BOX_NUM = 5;

private int mBoxSpace = 10;

public EditTextView(Context context) {

this(context,null);

}

public EditTextView(Context context, @Nullable AttributeSet attrs) {

this(context, attrs,0);

}

public EditTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

setFocusable(true);

setFocusableInTouchMode(true); //支持触摸聚焦

setClickable(true);

setGravity(Gravity.CENTER_VERTICAL);

setMaxLines(1);

setFilters(new InputFilter[]{

new InputFilter.LengthFilter(INPUT_BOX_NUM)

});

if(Build.VERSION.SDK_INT>=23) {

setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);

}

mBoxSpace = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,10,context.getResources().getDisplayMetrics());

addTextChangedListener(this);

}

@Override

protected boolean getDefaultEditable() {

return true;

}

@Override

protected void onDraw(Canvas canvas) {

// super.onDraw(canvas);

TextPaint paint = getPaint();

int strokeWidth = (int) paint.getStrokeWidth();

int boxWidth = (getWidth()- strokeWidth*2 - (INPUT_BOX_NUM-1)*mBoxSpace)/INPUT_BOX_NUM;

int boxHeight = getHeight() - strokeWidth*2;

RectF rectF = null;

Paint.Style style = paint.getStyle();

Paint.Align align = paint.getTextAlign();

paint.setTextAlign(Paint.Align.CENTER);

paint.setStyle(Paint.Style.STROKE);

paint.setTextAlign(Paint.Align.CENTER);

String text = getText().toString();

for (int i=0;i

rectF = new RectF(

i*(boxWidth+mBoxSpace),

0,

i*(boxWidth+mBoxSpace)+boxWidth,

boxHeight

);

Paint.FontMetrics fontMetrics = paint.getFontMetrics();

float top = fontMetrics.top;//为基线到字体上边框的距离,即上图中的top

float bottom = fontMetrics.bottom;//为基线到字体下边框的距离,即上图中的bottom

int baseLineY = (int) (rectF.centerY() - top/2 - bottom/2);//基线中间点的y轴计算公式

canvas.drawRoundRect(rectF,0,0,paint);

if(text.length()>i) {

String CH = String.valueOf(text.charAt(i));

canvas.drawText(CH,rectF.centerX(),baseLineY,paint);

}

}

paint.setStyle(style);

paint.setTextAlign(align);

}

/**

* 控制是否返回完整文本

* @return

*/

@Override

public boolean getFreezesText() {

return true;

}

@Override

public Editable getText() {

return (Editable) super.getText();

}

@Override

public void setText(CharSequence text, BufferType type) {

super.setText(text, BufferType.EDITABLE);

}

/**

* 控制光标展示

* @return

*/

@Override

protected MovementMethod getDefaultMovementMethod() {

return ArrowKeyMovementMethod.getInstance();

}

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override

public void afterTextChanged(Editable s) {

}

}

android用java写文本框_Android 使用TextView实现验证码输入框相关推荐

  1. android用java写文本框_Android 自动完成文本框的实例

    Android:自动完成文本框 xml文件代码如下: xmlns:android="http://schemas.android.com/apk/res/android" andr ...

  2. android+点击屏幕隐藏键盘,Android点击EditText文本框之外任何地方隐藏键盘的解决办法...

    1,实现方法一: 通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏 android:id="@+id/traceroute ...

  3. Android Studio基础输入文本框EditText

    Android Studio基础输入文本框EditText 接续上一节<Android Studio 基础按钮使用> 1.提示文本框.输入文本框,在布局xml编写 <EditText ...

  4. JAVA写文本编辑器(四)

    其实写到这里,我已经差不多断气了... 常规套路,这里是前三篇的传送门,需要的同学可以看一下:JAVA写文本编辑器(三) JAVA写文本编辑器(二)JAVA写文本编辑器(一) 现在我们只差最后一部分了 ...

  5. java软件屏幕大小转换,android 用java写一个自动适配各种屏幕大小的工具

    android 用java写一个自动适配各种屏幕大小的工具,假设我当前机器屏幕宽高为1920*1116,我页面某个组件的宽度为100px,那么在1280*800的机器上,按道理将应该是100/1920 ...

  6. java swing做输入框,java Swing 文本框的使用

    /** * Java Swing 文本框控件 * @author gao */ package com.gao; import java.awt.GridLayout; import javax.sw ...

  7. java中文本框显示在命令按钮后面_Maya中Pymel写个带界面的重命名工具(一)

    创建窗口 pymel.core.windows.window() 此命令用来创建一个窗口,但不会显示窗口 显示窗口 pymel.core.windows.showWindow() 此命令用来显示指定窗 ...

  8. java 限制文本框长度_java中限制文本框输入长度的显示(转载)

    我最近在网上看到一篇文章很不错,对于限制文本框输入长度的显示很方便 JAVA不像C#能够有maxLength这个属性对文本框的输入长度进行控制,但也是有办法实现相应的功能的. 写一个MyDocumen ...

  9. (Android Studio)添加文本框

    此文大部分摘自http://hukai.me/android-training-course-in-chinese/basics/firstapp/building-ui.html android : ...

最新文章

  1. python使用input函数时、必须添加提示文字-python input函数
  2. 立体匹配之NCC算法
  3. 判断比较器Comparator和Comparable的升序降序问题
  4. k8s pvc扩容:pvc创建后扩容
  5. (简单) POJ 3984 迷宫问题,BFS。
  6. python入门系列:迭代器和生成器
  7. python的数组下标_python数组下标
  8. Axure 8 团队协作
  9. 线性表的定义和基本操作
  10. 一文了解复旦大学NLP实验室的14篇EMNLP 2022长文内容
  11. html 自动 生成 日期,自己生成Select列表日期时间
  12. Linux摄像头UVC驱动第五篇--启动传输之设置摄像头参数
  13. 【Excel VBA】神操作之命名单元格或区域(二)——引用命名单元格或区域
  14. 基于单片机的心率脉搏检测电路设计(#0200)
  15. [讨论]一个真正的IT人来谈中国与印度的软件
  16. 如何利用链接诱饵来为网站获取强大的流量?
  17. 畅享原汁+气泡的双倍快乐 摩飞气泡原汁机全面评测
  18. (转)Dundas Chart for .NET
  19. 【码蹄集】(百度松果菁英班)MT1062 圆锥体表面积
  20. Qt编写项目作品大全

热门文章

  1. leetcode 1184 python
  2. IDEA的使用,手把手带你快速入门IDEA
  3. 警示:强制关闭OGG进程触发bug致abended,详述处理过程
  4. 基于大数据搭建社交好友推荐系统
  5. 从物理空间到数字世界,数字孪生打造智能化基础设施
  6. 【华为云技术分享】从零搭建一个灰度发布环境
  7. 都是程序员,凭什么他工资比我高,下班比我早?
  8. 技术谈 | SDN 和 NFV 之间的爱与恨
  9. 老兵的十年职场之路(一)
  10. ubuntu php mysql apache_Ubuntu+Apache+PHP+Mysql环境搭建(完整版)(转)