热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android自定义密码输入框实现代码

最近做个项目自定义密码输入框功能,下面小编把实现思路分享到脚本之家平台,需要的朋友参考下吧

效果

自定义密码输入框,项目的一个界面需求,我把这个自定义的输入框提取出来作为这次内容的题目。

输入前:

 

输入后:

 

输入1个字符就红一个圈圈,很简单的效果。

思路

1.自定义EditText。

2.背景为一个外圆环加内实心圆。

3.edittext的长度变化时候重新绘制背景或者红色环位置。

关键代码

代码其实也很简单,顺手拿资源的请到文末。

1.画背景

/**
   * 绘制背景外圆
   */
  private void drawOutRing(Canvas canvas) {
    mPaint.setColor(mBgColor);
    // 设置画笔为空心
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(mBgSize);
    RectF rectF = new RectF(mBgSize, mBgSize, getWidth() - mBgSize, getHeight() - mBgSize);
    // 画圆
    for (int i = 0; i 

2.画实心内圆背景

/**
   * 绘制背景内圆
   */
  private void drawInRing(Canvas canvas) {
    mPaint.setColor(mDivisionLineColor);
    // 设置画笔为实心
    mPaint.setStyle(Paint.Style.FILL);
    // 画圈圈
    for (int i = 0; i 

3.绘制输入密码的变化动作

/**
   * 绘制隐藏的密码
   */
  private void drawHidePassword(Canvas canvas) {
    int passwordLength = getText().length();
    if (passwordLength > 6) passwordLength = 6;
    mPaint.setColor(mPasswordColor);
    // 画实心内圆
    mPaint.setStyle(Paint.Style.FILL);
    for (int i = 0; i 

4.重写onDraw

int passwordWidth = getWidth() - (mPasswordNumber - 1) * mDivisionLineSize;
    mPasswordItemWidth = passwordWidth / mPasswordNumber;
    // 绘制背景外圆
    drawOutRing(canvas);
    // 绘制背景内圆
    drawInRing(canvas);
    // 绘制密码
    drawHidePassword(canvas);

5.xml引用


  

6.还可以设置些属性

在sytle中设置,通过xml中的app:xxx引用。


  

完整代码

一些样式,我设置了,结果直接没用上


    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  

自定义Edittext

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
/**
 *自定义密码输入框
 */
public class PasswordView extends EditText {
  // 画笔
  private Paint mPaint;
  // 一个密码所占的宽度
  private int mPasswordItemWidth;
  // 密码的个数默认为6位数
  private int mPasswordNumber = 6;
  // 背景圆颜色
  private int mBgColor = Color.parseColor("#d1d2d6");
  // 背景大小
  private int mBgSize = 1;
  // 背景边框圆角大小
  private int mBgCorner = 0;
  // 外圆的颜色
  private int outRingLineColor = mBgColor;
  // 外圆线条的大小
  private int outRingLineSize = 1;
  // 密码输入的颜色
  private int mPasswordColor = Color.parseColor("#cb3435");
   // 密码圆点的半径大小
  private int mPasswordRadius = 6;
  // 外圆半径大小
  private int mOutRadius = 25;
  public PasswordView(Context context) {
    this(context, null);
  }
  public PasswordView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initPaint();
    initAttributeSet(context, attrs);
    // 设置输入模式是密码
    setInputType(EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);
    // 不显示光标
    setCursorVisible(false);
  }
  /**
   * 初始化属性
   */
  private void initAttributeSet(Context context, AttributeSet attrs) {
    TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.PasswordView);
    // 获取大小
    outRingLineSize = (int) array.getDimension(R.styleable.PasswordView_outRingLineSize, dip2px(outRingLineSize));
    mPasswordRadius = (int) array.getDimension(R.styleable.PasswordView_passwordRadius, dip2px(mPasswordRadius));
    mBgSize = (int) array.getDimension(R.styleable.PasswordView_bgSize, dip2px(mBgSize));
    mBgCorner = (int) array.getDimension(R.styleable.PasswordView_bgCorner, 0);
    // 获取颜色
    mBgColor = array.getColor(R.styleable.PasswordView_bgColor, mBgColor);
    outRingLineColor = array.getColor(R.styleable.PasswordView_outRingColor, outRingLineColor);
    mPasswordColor = array.getColor(R.styleable.PasswordView_passwordColor, mPasswordColor);
    array.recycle();
  }
  /**
   * 初始化画笔
   */
  private void initPaint() {
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
  }
  /**
   * dip 转 px
   */
  private int dip2px(int dip) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
        dip, getResources().getDisplayMetrics());
  }
  @Override
  protected void onDraw(Canvas canvas) {
    int passwordWidth = getWidth() - (mPasswordNumber - 1) * outRingLineSize;
    mPasswordItemWidth = passwordWidth / mPasswordNumber;
    // 绘制背景外圆
    drawOutRing(canvas);
    // 绘制背景内圆
    drawInRing(canvas);
    // 绘制密码
    drawHidePassword(canvas);
  }
  @Override
  public void setText(CharSequence text, BufferType type) {
    super.setText(text, type);
  }
  /**
   * 绘制背景外圆
   */
  private void drawOutRing(Canvas canvas) {
    mPaint.setColor(mBgColor);
    // 设置画笔为空心
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(mBgSize);
    RectF rectF = new RectF(mBgSize, mBgSize, getWidth() - mBgSize, getHeight() - mBgSize);
    // 画圆
    for (int i = 0; i  6) passwordLength = 6;
    mPaint.setColor(mPasswordColor);
    // 设置画笔为实心
    mPaint.setStyle(Paint.Style.FILL);
    for (int i = 0; i 

总结

以上所述是小编给大家介绍的Android 自定义密码输入框实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • 本文介绍了两种有效的方法来检查Android应用是否拥有特定权限,如媒体读写权限(media_rw)。通过这些方法,开发者和安全人员可以更好地了解应用的行为,确保其不会滥用权限。 ... [详细]
  • 本文详细介绍了ejabberd中的验证码服务、接收器以及服务器间通信的监督者和工作进程,包括它们的启动方式和主要功能。 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 深入解析Android多媒体框架
    本文详细探讨了Android多媒体框架的构成及其各组件的功能,旨在为开发者提供深入理解与应用的指导。 ... [详细]
  • 在Ubuntu 16.04中使用Anaconda安装TensorFlow
    本文详细介绍了如何在Ubuntu 16.04系统上通过Anaconda环境管理工具安装TensorFlow。首先,需要下载并安装Anaconda,然后配置环境变量以确保系统能够识别Anaconda命令。接着,创建一个特定的Python环境用于安装TensorFlow,并通过指定的镜像源加速安装过程。最后,通过一个简单的线性回归示例验证TensorFlow的安装是否成功。 ... [详细]
  • 本文介绍了ThinkPHP框架的基本概念及其主要特性。作为一款遵循Apache许可证的开源框架,ThinkPHP不仅支持多种平台和Web服务器,还提供了丰富的功能以适应不同的开发需求。 ... [详细]
  • 列表是 Python 编程语言中最常用的数据结构之一,它类似于其他编程语言中的数组。本文将详细介绍 Python 3 中列表的基本操作和特性。 ... [详细]
  • 本文介绍了如何使用 useradd 命令来创建用户及其相关组,以及如何通过指定参数来定制用户的属性,如UID、GID、家目录等。同时,也探讨了使用 userdel 命令安全地删除用户及其所有相关文件的方法。 ... [详细]
  • 请看|差别_Android 6.0 运行时权限处理解析
    请看|差别_Android 6.0 运行时权限处理解析 ... [详细]
  • 本文探讨了如何在Java后端配置CORS以支持或禁止携带凭证(如Cookie),并提供了前后端的具体实现方法。 ... [详细]
  • 将基于Web的互动多媒体体验引入手机和平板电脑历来面临诸多挑战,如性能瓶颈、API兼容性和HTML5音频及视频播放限制等问题。本文探讨了如何克服这些障碍,为《霍比特人:史矛革之战》打造了一个移动优先的沉浸式网络体验。 ... [详细]
  • 如何在Android手机上设置自定义闹钟铃声
    本文介绍了在Android设备上设置个性化闹钟铃声的具体步骤,包括创建必要的文件夹和调整系统设置。 ... [详细]
  • 本文详细介绍了如何在Android Studio中生成正式签名的APK文件,确保应用能够在Google Play等平台上顺利发布。文章还提供了相关的注意事项和常见问题解决方法。 ... [详细]
  • Mac系统下解决sh: ./configure: Permission denied错误的方法
    在Mac操作系统中,当尝试运行配置脚本时,可能会遇到权限被拒绝的错误提示。本文将详细解释这一问题的原因,并提供两种有效的解决方法。 ... [详细]
  • 第七次团队冲刺进展
    本次站立会议更新了项目进展,包括学生登录注册界面的初步实现和教师网页的设计优化。同时,我们对当前的任务进行了详细的讨论,并调整了后续的工作计划。 ... [详细]
author-avatar
x-诗儿_683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有