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>


自定义VIew实现验证码的绘制:

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
原创粉丝点击