全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android本地验证码的简易实现方法(防止暴力登录)

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实现短信验证码自动填写功能  # 自定义  # 四位  # 达芬奇  # 小编  # 类中  # 的是  # 也会  # 在此  # 最重要  # 只需  # 你知道  # 会在  # 要在  # 问我  # 给大家  # 这种情况  # 使其  # 人说  # 最主要 


相关文章: 高防服务器租用指南:配置选择与快速部署攻略  制作网站外包平台,自动化接单网站有哪些?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  TestNG的testng.xml配置文件怎么写  建站VPS能否同时实现高效与安全翻墙?  常州自助建站工具推荐:低成本搭建与模板选择技巧  如何做静态网页,sublimetext3.0制作静态网页?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  建站之星代理平台如何选择最佳方案?  如何快速生成橙子建站落地页链接?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  建站之星安全性能如何?防护体系能否抵御黑客入侵?  建站DNS解析失败?如何正确配置域名服务器?  香港服务器租用费用高吗?如何避免常见误区?  为什么Go需要go mod文件_Go go mod文件作用说明  如何零基础开发自助建站系统?完整教程解析  建站之星3.0如何解决常见操作问题?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  山东云建站价格为何差异显著?  Swift开发中switch语句值绑定模式  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  网站制作免费,什么网站能看正片电影?  ,柠檬视频怎样兑换vip?  ,如何利用word制作宣传手册?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  小型网站制作HTML,*游戏网站怎么搭建?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  开封网站制作公司,网络用语开封是什么意思?  网站app免费制作软件,能免费看各大网站视频的手机app?  C#怎么使用委托和事件 C# delegate与event编程方法  如何通过虚拟机搭建网站?详细步骤解析  如何在万网自助建站平台快速创建网站?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  SQL查询语句优化的实用方法总结  C#如何使用XPathNavigator高效查询XML  网站制作网站,深圳做网站哪家比较好?  详解jQuery中基本的动画方法  建站之星安装失败:服务器环境不兼容?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  网站制作模板下载什么软件,ppt模板免费下载网站?  如何在云服务器上快速搭建个人网站?  图册素材网站设计制作软件,图册的导出方式有几种?  Python文件管理规范_工程实践说明【指导】  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  建站主机如何选?性能与价格怎样平衡?  c++ stringstream用法详解_c++字符串与数字转换利器 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。