




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android中怎么自定义一个密码输入框
这篇文章给大家介绍Android中怎么自定义一个密码输入框,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。思路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.重写onDrawint
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="/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>自定义Edittextimport
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);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/JSCTS 55-2024道路危险货物运输企业安全评估规范
- T/CCMA 0207-2024塔式起重机起升机构电磁制动器
- 专业证书课程试题及答案
- 上海科学考试题目及答案
- 台球助教兼职合同7篇
- 租房合同范文:房屋租赁定金合同5篇
- 游乐场和幼儿园合作协议书4篇
- 瓦房合同书6篇
- 个人向个人借款合同书正式版4篇
- 疾病宣教动画制作要点
- 2025届广东省深圳实验学校高中园与惠东高级中学高三下学期5月适应性联考(三模)物理试卷
- 2025年苏教版科学小学五年级下册期末检测题附答案(二)
- 中国铁路济南局集团有限公司招聘普通高校考试真题2024
- 2025年高考第二次模拟考试物理(浙江卷)(考试版)-20250416-113627
- 施工项目资料管理试题及答案
- 烟草专卖合同协议书
- 车辆终止挂靠协议合同
- 《糖尿病合并高血压患者管理指南(2025版)》解读
- 成都设计咨询集团有限公司2025年社会公开招聘(19人)笔试参考题库附带答案详解
- 2025年度会计人员继续教育会计法律法规答题活动测试100题答案
- 2024年江西省高考化学试卷(真题+答案)
评论
0/150
提交评论