0. 前言

验证码无处不在,有人问我,你知道达芬奇密码下面是什么吗,对,答案就是达芬奇验证码。
验证码一个最主要的作用就是防止恶意暴力破解登录,防止不间断的登录尝试,有人说其实可以在服务器端对该终端进行登录间隔检测,如果间隔太短可以展示拒绝的姿态。但是还是本地验证码作用更加实在,可以减轻服务器端的压力。这篇将使用自定义View来实现一个如下效果的简易本地验证码。算是对自定义View知识的复习吧。
1. 布局结构
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:myattribute="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > <com.calvin.verification_code.MyView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:padding="10dp" myattribute:text="0 0 0 0 " myattribute:textcolor="#000" myattribute:textsize="40sp" android:id="@+id/myView" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="number" android:hint="刷新后输入" android:layout_below="@+id/myView" android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:id="@+id/editText" /> <Button android:text="确认" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/editText" android:layout_alignParentEnd="true" android:layout_marginEnd="10dp" android:id="@+id/button" /> </RelativeLayout>
在自定义控件MyView中使用了自定义属性,面试的时候偶尔也会被问到,其实并不难。这里使用文字内容、颜色和字号三个自定义属性。命名空间别忘了加。
自定义属性声明只需要在values目录下声明一个xml文件即可。文件名字不重要,重要的是这个name属性,因为我们会在自定义控件类中通过R.styleable.MyView来找到这个自定义属性声明信息。
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyView"> <attr name="text" format="string"/> <attr name="textcolor" format="color"/> <attr name="textsize" format="dimension"/> </declare-styleable> </resources>
2. 自定义View类
看一下这个类的构造函数:
public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);
for (int i = 0; i < a.getIndexCount(); i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.MyView_text:
mText = a.getString(attr);
break;
case R.styleable.MyView_textcolor:
//二参为默认颜色
mTextColor = a.getColor(attr, Color.BLACK);
break;
case R.styleable.MyView_textsize:
// 默认字体大小为16sp,TypeValue把sp转化为px
mTextSize = a.getDimensionPixelSize(attr,
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
16, getResources().getDisplayMetrics()));
break;
}
}
a.recycle();
mPaint = new Paint();
mPaint.setTextSize(mTextSize);
mBound = new Rect();
//获得绘制文本的宽和高
mPaint.getTextBounds(mText, 0, mText.length(), mBound);
this.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//生成一个随机的四位数字,并发送一个自定义广播
mText = randomText();
postInvalidate();
}
});
}
核心代码就是解析自定义属性,并初始化一个画笔,并把解析出来的字体大小设置给画笔,设计点击时间,使其被点击后重新随机产生四位数字验证码,并使用postInvalidate()刷新界面。最后使用mBound记录这个四位数文本的宽高。
2. 自定义View类中的其他细节
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = 0;
int height = 0;
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
switch (specMode) {
case MeasureSpec.EXACTLY:
width = getPaddingLeft() + getPaddingRight() + specSize;
break;
case MeasureSpec.AT_MOST:
width = getPaddingLeft() + getPaddingRight() + mBound.width();
break;
}
//同样逻辑处理高
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
mPaint.setColor(Color.YELLOW);
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);
mPaint.setColor(mTextColor);
canvas.drawText(mText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint);
Random random = new Random();
for(int i = 0; i <= 3; i++){
int temp = random.nextInt(colors.length);
mPaint.setColor(colors[temp]);
mPaint.setStrokeWidth(3);
canvas.drawLine(randomStartWidth(),randomStartHeight(),randomEndWidth(),randomEndHeight(),mPaint);
}
}
其实主要还是measure和draw的过程了。
在onMeasure()方法中最重要的逻辑应该就是处理MeasureSpec.AT_MOST的这种情况了,这时候前面的mBound.width()就起作用了。还有就是不管何种测量模式,都手动处理了padding的情况。
onDraw()方法中首先绘制了一个黄色矩形作为自定义View的背景,接着根据自定义属性中的文字内容和颜色绘制四位数字,最后绘制四条噪声直线,颜色随机,并且起始位置和结束位置也是随机产生的。
3. 实时改变维护的正确验证码
为了验证用户输入的验证码的正确性,需要在MainActivity中维护一个变量,在用户点击自定义View刷新验证码时,能够实时改变这个变量的值。这里使用自定义广播实现,在生成一个随机的四位数字,发送一个自定义广播。
Intent intent = new Intent();
intent.setAction("com.seu_calvin.update");
intent.putExtra("data", sb.toString());
getContext().sendBroadcast(intent);
接着在MainActivity注册一个广播接收者即可取得此时的验证码信息,在用户点击确定按钮后在拿到EditText中的值与其进行对比即可。这个逻辑还是比较简单的。
以上所述是小编给大家介绍的Android本地验证码的简易实现方法(防止暴力登录),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# android本地验证码
# android
# 验证码
# Android获取短信验证码的实现方法
# Android实现短信验证码获取自动填写功能(详细版)
# Android实现短信验证码自动拦截读取功能
# Android 验证码功能实现代码
# Android账号注册实现点击获取验证码倒计时效果
# Android获取和读取短信验证码的实现方法
# Android实现自动提取短信验证码功能
# Android实现短信验证码自动填写功能
# 自定义
# 四位
# 达芬奇
# 小编
# 类中
# 的是
# 也会
# 在此
# 最重要
# 只需
# 你知道
# 会在
# 要在
# 问我
# 给大家
# 这种情况
# 使其
# 人说
# 最主要
相关文章:
网站制作价目表怎么做,珍爱网婚介费用多少?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
常州企业网站制作公司,全国继续教育网怎么登录?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
网站按钮制作软件,如何实现网页中按钮的自动点击?
建站之星导航如何优化提升用户体验?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
C#怎么创建控制台应用 C# Console App项目创建方法
如何用搬瓦工VPS快速搭建个人网站?
如何通过FTP服务器快速搭建网站?
大型企业网站制作流程,做网站需要注册公司吗?
如何设置并定期更换建站之星安全管理员密码?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
Swift中循环语句中的转移语句 break 和 continue
如何通过主机屋免费建站教程十分钟搭建网站?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
建站之星如何通过成品分离优化网站效率?
如何快速搭建支持数据库操作的智能建站平台?
宝塔Windows建站如何避免显示默认IIS页面?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
宝塔新建站点报错如何解决?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何选择高效稳定的ISP建站解决方案?
如何选择适配移动端的WAP自助建站平台?
如何在IIS7上新建站点并设置安全权限?
5种Android数据存储方式汇总
如何快速搭建高效服务器建站系统?
网站制作服务平台,有什么网站可以发布本地服务信息?
做企业网站制作流程,企业网站制作基本流程有哪些?
怎么将XML数据可视化 D3.js加载XML
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何获取上海专业网站定制建站电话?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何用wdcp快速搭建高效网站?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
如何快速使用云服务器搭建个人网站?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
想学网站制作怎么学,建立一个网站要花费多少?
如何有效防御Web建站篡改攻击?
如何在服务器上配置二级域名建站?
c# await 一个已经完成的Task会发生什么
香港服务器网站推广:SEO优化与外贸独立站搭建策略
在线教育网站制作平台,山西立德教育官网?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
建站主机选购指南:核心配置与性价比推荐解析
*请认真填写需求信息,我们会在24小时内与您取得联系。