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 < mPasswordNumber; i++) {
      int cx = i * mDivisionLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize;
      canvas.drawCircle(cx, getHeight() / 2, mOutRadius, mPaint);
    }
  }

2.画实心内圆背景

/**
   * 绘制背景内圆
   */
  private void drawInRing(Canvas canvas) {
    mPaint.setColor(mDivisionLineColor);
    // 设置画笔为实心
    mPaint.setStyle(Paint.Style.FILL);
    // 画圈圈
    for (int i = 0; i < mPasswordNumber; i++) {
      int cx = i * mDivisionLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize;
      canvas.drawCircle(cx, getHeight() / 2, mPasswordRadius, mPaint);
    }
  }
}

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 < passwordLength; i++) {
      int cx = i * mDivisionLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize;
      canvas.drawCircle(cx, getHeight() / 2, mPasswordRadius, mPaint);
    }
    //外圆颜色
    mPaint.setColor(mPasswordColor);
    // 设置画笔为空心
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(mBgSize);
    RectF rectF = new RectF(mBgSize, mBgSize, getWidth() - mBgSize, getHeight() - mBgSize);
    // 画空心外圆
    for (int i = 0; i < passwordLength; i++) {
      int cx = i * mDivisionLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize;
      canvas.drawCircle(cx, getHeight() / 2, mOutRadius, mPaint);
    }
  }

4.重写onDraw

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

5.xml引用

<com***.PasswordView
    android:id="@+id/password"
    android:layout_width="240dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginTop="10dp"
    android:background="@null">
  </com***.PasswordView>

6.还可以设置些属性

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

<com.*.PasswordView
    android:id="@+id/password"
    android:layout_width="240dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginTop="10dp"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:bgColor="#ffffff"
    android:background="@null">
  </com.*.PasswordView>

完整代码

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

<declare-styleable name="PasswordView">
    <!-- 密码的个数 -->
    <attr name="passwordNumber" format="integer"/>
    <!-- 密码圆点的半径 -->
    <attr name="passwordRadius" format="dimension"/>
    <!-- 密码圆点的颜色 -->
    <attr name="passwordColor" format="color"/>
    <!-- 外圈颜色 -->
    <attr name="outRingColor" format="color"/>
    <!-- 外圆线条大小 -->
    <attr name="outRingLineSize" format="color"/>
    <!-- 背景边框的颜色 -->
    <attr name="bgColor" format="color"/>
    <!-- 背景边框的大小 -->
    <attr name="bgSize" format="dimension"/>
    <!-- 背景边框的圆角大小 -->
    <attr name="bgCorner" format="dimension"/>
  </declare-styleable>

自定义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 < mPasswordNumber; i++) {
      int cx = i * outRingLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize;
      canvas.drawCircle(cx, getHeight() / 2, mOutRadius, mPaint);
    }
  }
  /**
   * 绘制隐藏的密码
   */
  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 < passwordLength; i++) {
      int cx = i * outRingLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize;
      canvas.drawCircle(cx, getHeight() / 2, mPasswordRadius, mPaint);
    }
    //外圆
    mPaint.setColor(mPasswordColor);
    // 设置画笔为空心
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(mBgSize);
    RectF rectF = new RectF(mBgSize, mBgSize, getWidth() - mBgSize, getHeight() - mBgSize);
    // 如果没有设置圆角,就画矩形
    for (int i = 0; i < passwordLength; i++) {
      int cx = i * outRingLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize;
      canvas.drawCircle(cx, getHeight() / 2, mOutRadius, mPaint);
    }
  }
  /**
   * 绘制背景内圆
   */
  private void drawInRing(Canvas canvas) {
    mPaint.setColor(outRingLineColor);
    // 设置画笔为实心
    mPaint.setStyle(Paint.Style.FILL);
    // 画圈圈
    for (int i = 0; i < mPasswordNumber; i++) {
      int cx = i * outRingLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize;
      canvas.drawCircle(cx, getHeight() / 2, mPasswordRadius, mPaint);
    }
  }
}

总结

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

您可能感兴趣的文章:

  • android仿微信支付宝的支付密码输入框示例
  • Android 仿支付宝密码输入框效果
  • Android仿支付宝支付密码输入框
  • Android仿支付宝、京东的密码键盘和输入框
  • Android仿微信/支付宝密码输入框
  • Android文本输入框(EditText)输入密码时显示与隐藏
  • Android实现动态显示或隐藏密码输入框的内容
(0)

相关推荐

  • Android 仿支付宝密码输入框效果

    模仿支付宝输入效果,实现很简单,就是画个矩形框和圆形,其他的通过组合view来实现所有功能,虽然简单但是封装起来,方便以后使用,也分享一下,希望对别人也有点帮助. 1.如何使用,可以设置自己的进入退出动画,不设置则没有动画效果,自己觉得封装之后还是非常用好的. private MyInputPwdUtil myInputPwdUtil; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(sa

  • Android仿支付宝支付密码输入框

    本文实例为大家分享了Android实现一个仿支付宝支付密码的输入框,主要实现如下: PasswordView.java package com.jackie.alipay.password; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphic

  • Android文本输入框(EditText)输入密码时显示与隐藏

    代码很简单,这里就不多废话了. 复制代码 代码如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android.text.Selection; import android.text.Spannable; import android.text.method.HideReturnsTransformationMethod; import android.text.method.Passw

  • Android仿微信/支付宝密码输入框

    在用到支付类app时,都有一个简密的输入框..开始实现的时候思路有点问题,后来到github上搜了下,找到了一个开源的库看起来相当的牛逼,,来个地址先: https://github.com/Jungerr/GridPasswordView 效果图: 这个开源库我研究了之后,又有了自己的一个思路:来个假的简密框---底部放一个EditTextView,顶部放置6个ImageView的原点,控制他们的显隐来实现这个简密宽 开发步骤: 1 布局 <?xml version="1.0"

  • android仿微信支付宝的支付密码输入框示例

    大家好,我是狸小华,萌汉子一枚.今天给大家带来的是仿微信/支付宝的密码输入框.这个效果也出来有一段时间了,所以搜索一下还是有不少的网友实现,但是,但是!经过一番查看后,我发现他们的实现分为两大类. 一,直接继承EditText,然后在ondraw里面做文章:二,EditText外面包一个viewGroup.我不喜欢这两种实现方式,觉着有些臃肿了,所以我详细介绍下我的实现方式:直接继承View,获取用户的输入,然后draw出来. 我们实现的是上面的密码输入框,这个键盘...系统自带的哦,调用用户输

  • Android实现动态显示或隐藏密码输入框的内容

    本文实例展示了Android实现动态显示或隐藏密码输入框内容的方法,分享给大家供大家参考之用.具体方法如下: 该功能可通过设置EditText的setTransformationMethod()方法来实现隐藏密码或者显示密码. 示例代码如下: private Button mBtnPassword; private EditText mEtPassword; private boolean mbDisplayFlg = false; /** Called when the activity is

  • Android仿支付宝、京东的密码键盘和输入框

    首先看下效果图 一:布局代码 键盘由0~9的数字,删除键和完成键组成,也可以根据需求通过GridView适配器的getItemViewType方法来定义.点击键的时候背景有变色的效果. 密码输入框由六个EditText组成,每个输入框最对能输入一个数字,监听最后一个输入框来完成密码输入结束的监听. 二:键盘 键盘中的主要逻辑处理,键盘样式,item的点击事件 @Override public int getViewTypeCount() { return 2; } @Override publi

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

    效果 自定义密码输入框,项目的一个界面需求,我把这个自定义的输入框提取出来作为这次内容的题目. 输入前: 输入后: 输入1个字符就红一个圈圈,很简单的效果. 思路 1.自定义EditText. 2.背景为一个外圆环加内实心圆. 3.edittext的长度变化时候重新绘制背景或者红色环位置. 关键代码 代码其实也很简单,顺手拿资源的请到文末. 1.画背景 /** * 绘制背景外圆 */ private void drawOutRing(Canvas canvas) { mPaint.setColo

  • Android 自定义状态栏实例代码

    一.目标:Android5.0以上 二.步骤 1.在res-values-colors.xml下新建一个RGB颜色 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#3

  • android自定义对话框实例代码

    1.实现效果    2.定义dialog.xml (res/layout/dialog.xml) <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android

  • Android自定义DataTimePicker实例代码(日期选择器)

    笔者有一段时间没有发表关于Android的文章了,关于Android自定义组件笔者有好几篇想跟大家分享的,后期会记录在博客中.本篇博客给大家分享的是自定义一个日期选择器,可以让用户同时选择年月日和当前时间. 先看看效果: 实现的效果就是在同一个布局上显示日期选择和时间选择. 自定义一个类: /DateTimePicker/src/com/wwj/datetimepicker/DateTimePickDialogUtil.java package com.wwj.datetimepicker; i

  • Android自定义密码输入框和数字键盘

    实现了一个自定义的密码输入框和自定义数字键盘,用作用户支付密码设置界面.先上效果图如下,方格样式,以及点击空白处隐藏软键盘. 控件实现清单: 1)集成于EditText的输入框控件:PasswordInputView.java 2)数字键盘工具类:NumKeyboardUtil.java 3)xml文件:number.xml 4)attrs样式 5)layout文件 具体内容: PasswordInputView.java public class PasswordInputView exten

  • Android自定义日历Calender代码实现

    产品要做签到功能,签到功能要基于一个日历来进行,所以就根据 要求自定义了一个日历 自定义控件相信做android都知道: (1)首先创建一个类,继承一个容器类或者是一个控件 (2)然后就是你需要设置的属性等的,在attrs文件夹中 (3)然后就是在类里边进行属性的设置以及布局等等功能的添加 其实自定义一个日历问题都不多,很多人都会想到通过一个gridView然后填充就可以,确实是这样,主要是在显示每个月的第一天的位置以及每个月显示多少天有点绕. 思路:通过判断当前星期几然后进行日历的填充,但是填

  • Android自定义实现开关按钮代码

    我们在应用中经常看到一些选择开关状态的配置文件,做项目的时候用的是android的Switch控件,但是感觉好丑的样子子 个人认为还是自定义的比较好,先上个效果图: 实现过程: 1.准备开关不同状态的两张图片放入drawable中. 2.xml文件中添加代码: <ToggleButton android:id="@+id/switch1" android:layout_width="wrap_content" android:layout_height=&qu

  • Android自定义密码输入框的简单实现过程

    目录 一.实现效果及方案 二.实现 总结 一.实现效果及方案 预期效果图: 如上图所示,要实现一个这种密码输入框的样式,原生并未提供类似的效果,所以需要自定义控件的方式实现. 预期的基础效果: 只接受数字: 支持输入加密显示: 支持删除: 密码位数可配置: 文字大小.颜色.数字框背景可配置: 方案分析: 需要解决的问题: 配置性: 输入.删除如何实现? 整体UI如何实现? 1.对于输入删除可以通过setOnKeyListener监听软件盘的事件. 2.可配置性数据可以通过自定义的属性文件配置:

  • Android自定义桌面功能代码实现

    先上运行效果图 首先我们要把一张自己喜欢的图片放到sdcard中,总之,只要我们可以获取这个图片就可以了. 我这里是放在sdcard中的,可以在eclipse中用鼠标点击导入,比较方便,也可以在命令行中运行: C:\Documents and Settings\Administrator>adb push "C:\Documents and Settings\Administrator\My Documents\My Pictures\MM-320x480.png" /sdcar

  • Android自定义popupwindow实例代码

    先来看看效果图: 一.布局  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content&qu

随机推荐