Android在本地实现验证码的验证
来源:互联网 发布:怎么做淘宝优惠券群主 编辑:程序博客网 时间:2024/05/20 22:38
前几天看了一篇关于本地验证码的实现的文章,自己跟着做了一下,也完成了博客的内容。但是我们既然学会了这个方法,就要开始投入使用。但是由于原文章没有写出如何实现输入验证码与验证码是否正确,所以我自己捣鼓了一下。首先申明,本人是菜鸟一个,所以虽然在各位大神看来很简单的问题但是我琢磨了一天才弄出来。
Demo拥有验证码的基本功能,点击切换图片,随机生成验证码,位置动态变化等,还预留了动态改变字体颜色等接口。下边贴出效果图:
输入我们看到的数字验证码1135,然后点击“验证”按钮,可以看到验证成功。
实现方法如下:
首先在XML文件中添加相应的控件,EditText、Button、自定义的View
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"><EditText android:id="@+id/edittext" android:hint="请输入你看到的验证码0~9" android:layout_width="match_parent" android:layout_height="wrap_content"/><Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="验证" /><com.zyb.checkview.CheckView android:id="@+id/checkView" android:layout_width="80sp" android:layout_height="38sp" android:layout_marginLeft="5dp" > </com.zyb.checkview.CheckView></LinearLayout>
package com.zyb.checkview;import android.content.Context;import android.view.View;import java.util.Random; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.util.AttributeSet; public class CheckView extends View { //验证码图片 private Bitmap bitmap = null; //随机生成所有的数组 final String[] strContent = new String[]{"0","1","2","3","4","5", "6", "7", "8", "9"}; //构造函数 public CheckView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void draw(Canvas canvas) { Paint paint = new Paint(); if (bitmap != null) { canvas.drawBitmap(bitmap, 0, 0, paint); } else { paint.setColor(Color.GRAY); paint.setTextSize(20); canvas.drawText("点击换一换", 10, 30, paint); } super.draw(canvas); } /** * 得到验证码;设置图片 * @return 生成的验证码中的数字 */ public String[] getValidataAndSetImage() { //产生随机数 String [] strRes = generageRadom(strContent); //传随机串和随机数 bitmap = generateValidate(strContent,strRes); //刷新 invalidate(); return strRes; } /** * 绘制验证码并返回 * @param strContent * @param strRes * @return */ private Bitmap generateValidate(String[] strContent,String [] strRes) { int width = 120,height =50; int isRes = isStrContent(strContent); if (isRes == 0) { return null; } //创建图片和画布 Bitmap sourceBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888); Canvas canvas = new Canvas(sourceBitmap); canvas.drawColor(Color.YELLOW); Paint numPaint = new Paint(); numPaint.setTextSize(36); numPaint.setFakeBoldText(true); numPaint.setColor(Color.BLACK); //设置每个字 canvas.drawText(strRes[0], 10, height * 3 / 4, numPaint); Matrix mMatrix = new Matrix(); mMatrix.setRotate((float)Math.random()*25); canvas.setMatrix(mMatrix); canvas.drawText(strRes[1], 40, height * 3 / 4, numPaint); mMatrix.setRotate((float)Math.random()*25); canvas.setMatrix(mMatrix); canvas.drawText(strRes[2], 70, height * 3 / 4 - 10, numPaint); mMatrix.setRotate((float)Math.random()*25); canvas.setMatrix(mMatrix); canvas.drawText(strRes[3], 100, height * 3 / 4 - 15, numPaint); mMatrix.setRotate((float)Math.random()*25); canvas.setMatrix(mMatrix); //设置绘制干扰的画笔 Paint interferencePaint = new Paint(); interferencePaint.setAntiAlias(true); interferencePaint.setStrokeWidth(4); interferencePaint.setColor(Color.BLACK); interferencePaint.setStyle(Paint.Style.FILL); //设置paint的style //绘制直线 int [] line; for(int i = 0; i < 2; i ++) { line = CheckGetUtil.getLine(height, width); canvas.drawLine(line[0], line[1], line[2], line[3],interferencePaint); } // 绘制小圆点 int [] point; for(int i = 0; i < 100; i++) { point=CheckGetUtil.getPoint(height, width); canvas.drawCircle(point[0], point[1], 1, interferencePaint); } canvas.save(); return sourceBitmap; } private int isStrContent(String[] strContent) { if (strContent == null || strContent.length <= 0) { return 0; } else { return 1; } } /** * 从指定数组中随机取出4个字符(数组) * @param strContent * @return */ private String[] generageRadom(String[] strContent){ String[] str = new String[4]; // 随机串的个数 int count = strContent.length; // 生成4个随机数 Random random = new Random(); int randomResFirst = random.nextInt(count); int randomResSecond = random.nextInt(count); int randomResThird = random.nextInt(count); int randomResFourth = random.nextInt(count); str[0] = strContent[randomResFirst].toString().trim(); str[1] = strContent[randomResSecond].toString().trim(); str[2] = strContent[randomResThird].toString().trim(); str[3] = strContent[randomResFourth].toString().trim(); return str; } }
编写工具类,随机生成线和点的位置,验证验证码,生成随机数:
package com.zyb.checkview;public class CheckGetUtil {//获得画干扰直线的位置 public static int[] getLine(int height, int width) { int [] tempCheckNum = {0, 0 ,0, 0, 0}; for(int i = 0; i < 4; i+=2) { tempCheckNum[i] = (int) (Math.random() * width); tempCheckNum[i + 1] = (int) (Math.random() * height); } return tempCheckNum; } //获得干扰点的位置 public static int[] getPoint(int height, int width) { int [] tempCheckNum = {0, 0, 0, 0, 0}; tempCheckNum[0] = (int) (Math.random() * width); tempCheckNum[1] = (int) (Math.random() * height); return tempCheckNum; } }
最后一步当然是调用实现:
package com.zyb.checkview;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends ActionBarActivity { private static final String TAG = "LifeCycleActivity"; private CheckView mMyView ; private Button btn; private EditText etx; @SuppressWarnings("unused")private String[] res = new String[4]; //获取每次更新的验证码,可用于判断用户输入是否正确 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mMyView = (CheckView)findViewById(R.id.checkView); btn = (Button) findViewById(R.id.button1);etx = (EditText) findViewById(R.id.edittext); //初始化验证码 res = mMyView.getValidataAndSetImage(); mMyView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //重新初始化验证码 res = mMyView.getValidataAndSetImage(); } }); btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif(etx.getText().toString().equals(res[0]+res[1]+res[2]+res[3])){Toast.makeText(MainActivity.this, "验证码正确", Toast.LENGTH_SHORT).show();}else{Toast.makeText(MainActivity.this, "验证码错误", Toast.LENGTH_SHORT).show();}}});}}到这里就已经完成了所有的代码。在实现的过程中遇到最大的问题就是如何把EditText输入的验证码数字etx.getText().toString()和随机生成的验证码res进行比较。由于res属于String[],而etx.getText().toString()确实确属String类型的,无法直接比较。所以我试了各种方法,什么类型转换,强制转换都试过,最后都没有成功。最后我只能试着把res分成res[0]+res[1]+res[2]+res[3],想不到就成功了。虽然对于大神来说很简单的问题,但是我却用了一天的时间才解决这个问题,以后还得多花时间好好的学习。
文章前面提到的我看到的文章是:Android本地验证码的一种实现,来自http://blog.csdn.net/u010538765/article/details/10084951。
0 0
- Android在本地实现验证码的验证
- android 本地验证码的一种实现
- android 本地验证码的一种实现
- 本地验证码的实现
- Android本地验证码验证
- Android开发——本地验证码的简易实现
- Android本地验证码的生成
- Android实现本地密码验证登陆
- android之简单好用的本地生成验证码并进行验证
- android 短信验证码的实现
- Android图片验证码的实现
- Android一个自定义验证码的实现
- Android---验证码倒计时的简单实现
- Android 验证码倒计时功能的实现
- Android图形验证码的实现
- android 本地生成图形验证码
- 简单的本地验证
- “验证码”的实现
- LeetCode | Search in Rotated Sorted Array II
- windows多线程没那么难
- android actionbar
- iOS自动布局autolayout(1)
- 巧用C#webbrowser以及Application.DoEvents()实现采集动态网页的爬虫机器人
- Android在本地实现验证码的验证
- Python在HTTP接口测试中的应用
- iOS 8 Auto Layout界面自动布局系列3-使用代码添加布局约束
- sqlserver2008中cast和convert函数--类型转换
- leetcode 26 Remove Duplicates from Sorted Array
- KMP(Knuth-Morris-Pratt)算法
- Android 高仿微信头像截取 打造不一样的自定义控件
- 大文件断点续传
- jQuery中html()/text()/val()函数的区别