效果图:

截图.png

直接上代码:

/**

* Description: 密码 输入框

* Created by zouyulong on 2017/7/31.

*/

public class CustomPasswordInputView extends EditText {

private Context mContext;

/**

* 第一个密码实心圆的圆心坐标

*/

private float mFirstCircleX;

private float mFirstCircleY;

/**

* 当前输入的个数

*/

private int mCurInputCount = 0;

/**

* 实心圆的半径

*/

private int mCircleRadius = dip2px(getContext(), 5);

/**

* view的宽高

*/

private int mHeight;

private int mWidth;

/**

* 最大输入位数

*/

private int mMaxCount = 6;

/**

* 圆的颜色 默认BLACK

*/

private int mCircleColor = Color.BLACK;

/**

* 边线的颜色

*/

private int mStrokeColor = Color.BLACK;

/**

* 分割线的颜色

*/

private int mDevideLineColor = Color.BLACK;

/**

* 描边的画笔

*/

private Paint mStrokePaint;

/**

* 分割线开始的坐标x

*/

private int mDivideLineWStartX;

/**

* 分割线的宽度

*/

private int mDivideLineWidth = dip2px(getContext(), 0.5f);

/**

* 描边的矩形

*/

private RectF mFrameRectF = new RectF();

/**

* 矩形边框的圆角

*/

private int mRectAngle = 0;

/**

* 竖直分割线的画笔

*/

private Paint mDivideLinePaint;

/**

* 圆的画笔

*/

private Paint mCirclePaint;

/**

* 密码输入完成事件

*/

private OnPasswordCompleteListener mCompleteListener;

public CustomPasswordInputView(Context context, AttributeSet attrs) {

super(context, attrs);

mContext = context;

getAtt(attrs);

initPaint();

this.setCursorVisible(false);

this.setFilters(new InputFilter[]{new InputFilter.LengthFilter(mMaxCount)});

}

private void getAtt(AttributeSet attrs) {

TypedArray typedArray = mContext.obtainStyledAttributes(attrs, R.styleable.CustomPasswordInputView);

mMaxCount = typedArray.getInt(R.styleable.CustomPasswordInputView_maxCount, mMaxCount);

mCircleColor = typedArray.getColor(R.styleable.CustomPasswordInputView_pwdcircleColor, mCircleColor);

mCircleRadius = typedArray.getDimensionPixelOffset(R.styleable.CustomPasswordInputView_pwdCircleRadius, mCircleRadius);

mStrokeColor = typedArray.getColor(R.styleable.CustomPasswordInputView_strokeColor, mStrokeColor);

mDevideLineColor = typedArray.getColor(R.styleable.CustomPasswordInputView_devideLineColor, mDevideLineColor);

mDivideLineWidth = typedArray.getDimensionPixelSize(R.styleable.CustomPasswordInputView_divideLineWidth, mDivideLineWidth);

mRectAngle = typedArray.getDimensionPixelOffset(R.styleable.CustomPasswordInputView_rectAngle, mRectAngle);

typedArray.recycle();

}

/**

* 初始化画笔

*/

private void initPaint() {

mCirclePaint = getPaint(dip2px(getContext(), 5), Paint.Style.FILL, mCircleColor);

mStrokePaint = getPaint(dip2px(getContext(), 0.5f), Paint.Style.STROKE, mStrokeColor);

mDivideLinePaint = getPaint(mDivideLineWidth, Paint.Style.FILL, mStrokeColor);

}

/**

* 设置画笔

*

* @param strokeWidth 画笔宽度

* @param style 画笔风格

* @param color 画笔颜色

* @return

*/

private Paint getPaint(int strokeWidth, Paint.Style style, int color) {

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setStrokeWidth(strokeWidth);

paint.setStyle(style);

paint.setColor(color);

paint.setAntiAlias(true);

return paint;

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

mHeight = h;

mWidth = w;

mDivideLineWStartX = w / mMaxCount;

mFirstCircleX = w / mMaxCount / 2;

mFirstCircleY = h / 2;

mFrameRectF.set(0, 0, mWidth, mHeight);

}

@Override

protected void onDraw(Canvas canvas) {

//不删除的画会默认绘制输入的文字

// super.onDraw(canvas);

drawWeChatBorder(canvas);

drawPsdCircle(canvas);

}

/**

* 画微信支付密码的样式

*

* @param canvas

*/

private void drawWeChatBorder(Canvas canvas) {

canvas.drawRoundRect(mFrameRectF, mRectAngle, mRectAngle, mStrokePaint);

for (int i = 0; i < mMaxCount - 1; i++) {

canvas.drawLine((i + 1) * mDivideLineWStartX,

0,

(i + 1) * mDivideLineWStartX,

mHeight,

mDivideLinePaint);

}

}

/**

* 画密码实心圆

*

* @param canvas

*/

private void drawPsdCircle(Canvas canvas) {

for (int i = 0; i < mCurInputCount; i++) {

canvas.drawCircle(mFirstCircleX + i * 2 * mFirstCircleX,

mFirstCircleY,

mCircleRadius,

mCirclePaint);

}

}

@Override

protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {

super.onTextChanged(text, start, lengthBefore, lengthAfter);

mCurInputCount = text.toString().length();

if (mCurInputCount == mMaxCount && mCompleteListener !=null) {

mCompleteListener.onComplete(getPasswordString());

}

invalidate();

}

@Override

protected void onSelectionChanged(int selStart, int selEnd) {

super.onSelectionChanged(selStart, selEnd);

//保证光标始终在最后

if (selStart == selEnd) {

setSelection(getText().length());

}

}

/**

* 获取输入的密码

*

* @return

*/

public String getPasswordString() {

return getText().toString().trim();

}

/**

* 密码输入完成回调

*/

public interface OnPasswordCompleteListener {

void onComplete(String password);

}

public void setOnCompleteListener(OnPasswordCompleteListener mListener) {

this.mCompleteListener = mListener;

}

/**

* dp转px 自定义事件注意使用dp为单位

* @param var0

* @param var1

* @return

*/

public static int dip2px(Context var0, float var1) {

float var2 = var0.getResources().getDisplayMetrics().density;

return (int)(var1 * var2 + 0.5F);

}

}

就不做讲解了,每一行代码都做了详细的注解,代码已经上传到了github上面。

github地址:

Android自定义弹窗模仿微信,android自定义仿微信、支付宝 密码输入框相关推荐

  1. android仿微信充值布局,仿微信充值金额输入框-自定义EditText

    1. 概述 在开发过程中,有时候我们需要在输入框中输入金额,并且输入金额有一定的规则限制: 1>:只能是数字: 2>:第一位只能是数字,不能是小数点,如果第一位是小数点,就默认在小数点前加 ...

  2. 【Android视图效果】共享元素实现仿微信查看大图效果

    在之前的文章中,我们通过动画实现了这个,具体可以查看[Android 动画]动画详解之仿微信查看大图效果(四),这里,我们用过度动画来实现. 什么是共享元素? 它是Android 5.0新加入的一种过 ...

  3. android微信运动页面开发,微信小程序仿微信运动步数排行(交互)

    微信小程序仿微信运动步数排行(交互) 发布时间:2020-08-20 00:51:02 来源:脚本之家 阅读:101 作者:祈澈姑娘 本文介绍了微信小程序仿微信运动步数排行(交互),分享给大家,也给自 ...

  4. 微信小程序仿微信SlideView组件slide-view

    微信小程序仿微信SlideView组件. 使用 1.安装 slide-view 从小程序基础库版本 2.2.1 或以上.及开发者工具 1.02.1808300 或以上开始,小程序支持使用 npm 安装 ...

  5. Java微信运动步数排序设计_微信小程序仿微信运动步数排行(交互)

    本文介绍了微信小程序仿微信运动步数排行(交互),分享给大家,也给自己留个笔记,废话不多说了,具体如下: 效果图如下: wxml: {{item.name}} {{item.steps}} wxss: ...

  6. Android自定义弹窗模仿微信,Android 仿微信朋友圈点赞和评论弹出框功能

    本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框.发评论,及弹出位置的控制. 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 点击左下角的"更多&q ...

  7. Android自定义弹窗模仿微信,Android仿微信右上角点击加号弹出PopupWindow

    本文实例为大家分享了Android仿微信右上角点击加号弹出展示的具体代码,供大家参考,具体内容如下 一.要弹出的布局,随便设计 android:layout_width="match_par ...

  8. Android自定义弹窗模仿微信,Android仿微信、qq点击右上角加号弹出操作框

    Android仿微信.qq点击右上角加号弹出操作框,先上图,类似于下图这种,点击加号,会弹出一个对话框,如下图: 微信: 自己实现: 接下来,我们来实现此功能: 其实,实现原理就是,点击"+ ...

  9. android 自定义view,字母排序(仿微信好友列表)

    一:简言 一个月没有写博客了,公司项目比较忙,最近发现公司用到一个知识点,所以抽时间通过博客的形式分享给大家,该知识点,模仿微信的好友列表,通过字母索引进行定位,该功能主要通过几个知识点实现.下面会一 ...

  10. Android 平板中 自定义键盘(popuwindow) 居于屏幕左下方 仿微信的密码输入界面

    之前博客中,介绍过使用谷歌提供的键盘的一些api,可以很好地自定义键盘,参考我之前的博客链接:android 自定义键盘 ,这个有一个局限性,只能占满屏幕,无法做到只能占一部分的需求键盘,如下图我平板 ...

最新文章

  1. C++ string字符串的比较是否相等
  2. 新概念英语(1-73)The way to King Street
  3. linux shell 文件 第一行插入字符串
  4. Python startswith() 方法
  5. ios点击大头针气泡不弹出_百度地图使用(二)自定义大头针和弹出气泡
  6. 静脉阻塞指标+补充笔记
  7. java 同步原语_你所不知道的有关Java 和Scala中的同步问题
  8. Bailian2765 POJ NOI0113-03 八进制小数【进制】
  9. Python字符串join()方法
  10. 0x3a能否作为c语言常量,C语言编程遇到了宏定义的问题,求解答,万分感谢
  11. 【620】【信息管理学基础】【真题背诵】
  12. 嵩天《Python数据分析与展示》实例3:Matplotlib基础图表绘制
  13. 微信公众号常见微信吸粉方式
  14. mysql按月查询统计(统计近12个月的项目个数)
  15. 基于区块链的二维码门禁系统成品演示视频
  16. 什么是Bom,常用的bom属性又有哪些?
  17. 爬虫在遇到post请求时的一种解决{“code“:40005,“msg“:“req json error“}问题的思路
  18. 《老男孩》上映 “娱乐宝”投资电影进入回收期
  19. c语言的四大圣经,传说中的模拟电子四大圣经--值得永久珍藏
  20. 联邦学习-让隐私和 AI 相伴前行

热门文章

  1. ULID 与 UUID:用于 JavaScript 的可排序随机 ID 生成器
  2. 诸葛分享:精细化APP运营要注意些什么呢?
  3. 华为汽车产业深度剖析
  4. SAP workflow基础-概览
  5. Visual Assist Trial 的补丁安装和破解
  6. 软件的开发环境、测试环境(沙盒环境sandbox)、生产环境
  7. 关于JS中如何获取页面数据
  8. 满足lisheng需求 linux添加环境变量 linux批处理 2016.04.25小结
  9. php 服务器日志管理系统,ThinkPHP6实现简单的记录网站后台管理操作日志方法
  10. 阿里云云导播---直播时,优化延迟及观看直播时清晰度迷糊问题