Android验证码

类似于CSDN的计算验证码,在之前的随机数字验证码Demo上扩展的,明早贴程序。

效果图:



Main.java:

[java]  view plain copy
  1. package com.zms.textlock;  
  2.   
  3. import android.graphics.Bitmap;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Matrix;  
  7. import android.support.v7.app.ActionBarActivity;  
  8. import android.os.Bundle;  
  9. import android.view.Menu;  
  10. import android.view.MenuItem;  
  11. import android.view.View;  
  12. import android.widget.Button;  
  13. import android.widget.EditText;  
  14. import android.widget.ImageView;  
  15. import android.widget.TextView;  
  16.   
  17. import java.util.Random;  
  18.   
  19.   
  20. public class Main extends ActionBarActivity {  
  21.     private Button btnLock;  
  22.     private EditText etLock;  
  23.     private String numStrTmp = "";  
  24.     private String numStr = "";  
  25.     private int[] numArray = new int[4];  
  26.     private int[] colorArray = new int[6];  
  27.   
  28.     private TextView tvHideA;  
  29.     private TextView tvHideB;  
  30.     private TextView tvHideC;  
  31.     private TextView tvHideD;  
  32.     private TextView tvHideE;  
  33.     private TextView tvHideF;  
  34.     private TextView tvHideG;  
  35.     private ImageView ivNumA;  
  36.     private ImageView ivNumB;  
  37.     private ImageView ivNumC;  
  38.     private ImageView ivNumD;  
  39.     private ImageView ivNumE;  
  40.     private ImageView ivNumF;  
  41.     private ImageView ivNumG;  
  42.     private Button btnCheck;  
  43.     private TextView tvCheck;  
  44.     private EditText etCheck;  
  45.   
  46.     // 计算类型的验证码  
  47.     private String[] strVerify = new String[3];  
  48.     private int[] intVerify = new int[3];  
  49.     private int intResult = -100;  
  50.     private EditText etVerify;  
  51.     private Button btnVerify;  
  52.     private TextView tvVerify;  
  53.   
  54.     @Override  
  55.     protected void onCreate(Bundle savedInstanceState) {  
  56.         super.onCreate(savedInstanceState);  
  57.         setContentView(R.layout.main);  
  58.         btnLock = (Button) findViewById(R.id.btnLock);  
  59.         etLock = (EditText) findViewById(R.id.etLock);  
  60.         btnLock.setOnClickListener(new onClickListenerImp());  
  61.   
  62.         tvHideA = (TextView) findViewById(R.id.tvHideA);  
  63.         tvHideB = (TextView) findViewById(R.id.tvHideB);  
  64.         tvHideC = (TextView) findViewById(R.id.tvHideC);  
  65.         tvHideD = (TextView) findViewById(R.id.tvHideD);  
  66.         tvHideE = (TextView) findViewById(R.id.tvHideE);  
  67.         tvHideF = (TextView) findViewById(R.id.tvHideF);  
  68.         tvHideG = (TextView) findViewById(R.id.tvHideG);  
  69.         ivNumA = (ImageView) findViewById(R.id.ivNumA);  
  70.         ivNumB = (ImageView) findViewById(R.id.ivNumB);  
  71.         ivNumC = (ImageView) findViewById(R.id.ivNumC);  
  72.         ivNumD = (ImageView) findViewById(R.id.ivNumD);  
  73.         // 计算类型的验证码  
  74.         ivNumE = (ImageView) findViewById(R.id.ivNumE);  
  75.         ivNumF = (ImageView) findViewById(R.id.ivNumF);  
  76.         ivNumG = (ImageView) findViewById(R.id.ivNumG);  
  77.         etVerify = (EditText) findViewById(R.id.etVerify);  
  78.         btnVerify = (Button) findViewById(R.id.btnVerify);  
  79.         btnVerify.setOnClickListener(new onClickListenerImp());  
  80.         tvVerify = (TextView) findViewById(R.id.tvVerify);  
  81.   
  82.         tvCheck = (TextView) findViewById(R.id.tvCheck);  
  83.         etCheck = (EditText) findViewById(R.id.etCheck);  
  84.         btnCheck = (Button) findViewById(R.id.btnCheck);  
  85.         btnCheck.setOnClickListener(new onClickListenerImp());  
  86.   
  87.         setNum();  
  88.         setVerify();  
  89.     }  
  90.   
  91.     /** 
  92.      * 计算类型的验证码 
  93.      */  
  94.     private void setVerify() {  
  95.         initStrVerify();  
  96.         tvHideE.setText(strVerify[0]);  
  97.         tvHideE.setTextColor(randomColor());  
  98.         tvHideG.setText(strVerify[1]);  
  99.         tvHideG.setTextColor(randomColor());  
  100.         tvHideF.setText(strVerify[2]);  
  101.         tvHideF.setTextColor(randomColor());  
  102.   
  103.         // Num 1  
  104.         Matrix matrixE = new Matrix();  
  105.         matrixE.reset();  
  106.         matrixE.setRotate(randomAngle());  
  107.         Bitmap bmNumE = Bitmap.createBitmap(getBitmapFromView(tvHideE, 5050), 005050, matrixE, true);  
  108.         ivNumE.setImageBitmap(bmNumE);  
  109.   
  110.         //Operator  
  111.         Matrix matrixF = new Matrix();  
  112.         matrixF.reset();  
  113.         matrixF.setRotate(randomAngle());  
  114.         Bitmap bmNumF = Bitmap.createBitmap(getBitmapFromView(tvHideF, 7050), 007050, matrixF, true);  
  115.         ivNumF.setImageBitmap(bmNumF);  
  116.   
  117.         // Num2  
  118.         Matrix matrixG = new Matrix();  
  119.         matrixG.reset();  
  120.         matrixG.setRotate(randomAngle());  
  121.         Bitmap bmNumG = Bitmap.createBitmap(getBitmapFromView(tvHideG, 5050), 005050, matrixG, true);  
  122.         ivNumG.setImageBitmap(bmNumG);  
  123.     }  
  124.   
  125.     private void initStrVerify() {  
  126.         // 获得两个不相等运算数值:0-9  
  127.         do {  
  128.             intVerify[0] = new Random().nextInt(10);  
  129.             intVerify[1] = new Random().nextInt(10);  
  130.         } while (intVerify[0] == intVerify[1]);  
  131.         // 获得运算符号:+,-,x  
  132.         intVerify[2] = new Random().nextInt(3);  
  133.         if (intVerify[2] == 0) {  
  134.             intResult = intVerify[0] + intVerify[1];  
  135.             strVerify[2] = "加上";  
  136.         } else if (intVerify[2] == 1) {  
  137.             intResult = intVerify[0] - intVerify[1];  
  138.             strVerify[2] = "减去";  
  139.         } else if (intVerify[2] == 2) {  
  140.             intResult = intVerify[0] * intVerify[1];  
  141.             strVerify[2] = "乘以";  
  142.         } else {  
  143.             intResult = -100;  
  144.             strVerify[2] = "呵呵";  
  145.         }  
  146.         strVerify[0] = numToCharacter(intVerify[0]);  
  147.         strVerify[1] = numToCharacter(intVerify[1]);  
  148.     }  
  149.   
  150.     private String numToCharacter(int num) {  
  151.         switch (num) {  
  152.             case 0:  
  153.                 return "零";  
  154.             case 1:  
  155.                 return "一";  
  156.             case 2:  
  157.                 return "二";  
  158.             case 3:  
  159.                 return "三";  
  160.             case 4:  
  161.                 return "四";  
  162.             case 5:  
  163.                 return "五";  
  164.             case 6:  
  165.                 return "六";  
  166.             case 7:  
  167.                 return "七";  
  168.             case 8:  
  169.                 return "八";  
  170.             case 9:  
  171.                 return "九";  
  172.             default:  
  173.                 return "错";  
  174.         }  
  175.     }  
  176.   
  177.     private class onClickListenerImp implements View.OnClickListener {  
  178.         @Override  
  179.         public void onClick(View view) {  
  180.             if (view == btnLock) {  
  181.                 if (etLock.isEnabled()) {  
  182.                     etLock.setEnabled(false);  
  183.                     btnLock.setText("解锁");  
  184.                 } else {  
  185.                     etLock.setEnabled(true);  
  186.                     btnLock.setText("锁定");  
  187.                 }  
  188.             } else if (view == btnCheck) {  
  189.                 if (etCheck.getText().toString() != null && etCheck.getText().toString().trim().length() > 0) {  
  190.                     tvCheck.setVisibility(View.VISIBLE);  
  191.                     if (numStr.equals(etCheck.getText().toString())) {  
  192.                         tvCheck.setText("输入正确");  
  193.                         tvCheck.setTextColor(Color.GREEN);  
  194.                     } else {  
  195.                         tvCheck.setText("输入错误");  
  196.                         tvCheck.setTextColor(Color.RED);  
  197.                     }  
  198.                 } else {  
  199.                     setNum();  
  200.                     tvCheck.setVisibility(View.GONE);  
  201.                 }  
  202.             } else if (view == btnVerify) {  
  203.                 if (etVerify.getText().toString() != null && etVerify.getText().toString().trim().length() > 0) {  
  204.                     tvVerify.setVisibility(View.VISIBLE);  
  205.                     if (etVerify.getText().toString().equals(String.valueOf(intResult))) {  
  206.                         tvVerify.setText("正确");  
  207.                         tvVerify.setTextColor(Color.GREEN);  
  208.                     } else {  
  209.                         tvVerify.setText("错误");  
  210.                         tvVerify.setTextColor(Color.RED);  
  211.                     }  
  212.   
  213.                 } else {  
  214.                     setVerify();  
  215.                     tvVerify.setVisibility(View.GONE);  
  216.                 }  
  217.             }  
  218.   
  219.         }  
  220.     }  
  221.   
  222.     public void initNum() {  
  223.         numStr = "";  
  224.         numStrTmp = "";  
  225.         for (int i = 0; i < numArray.length; i++) {  
  226.             int numIntTmp = new Random().nextInt(10);  
  227.             numStrTmp = String.valueOf(numIntTmp);  
  228.             numStr = numStr + numStrTmp;  
  229.             numArray[i] = numIntTmp;  
  230.         }  
  231.     }  
  232.   
  233.     public void setNum() {  
  234.   
  235.         initNum();  
  236.         tvHideA.setText("" + numArray[0]);  
  237.         tvHideA.setTextColor(randomColor());  
  238.         tvHideB.setText("" + numArray[1]);  
  239.         tvHideB.setTextColor(randomColor());  
  240.         tvHideC.setText("" + numArray[2]);  
  241.         tvHideC.setTextColor(randomColor());  
  242.         tvHideD.setText("" + numArray[3]);  
  243.         tvHideD.setTextColor(randomColor());  
  244.   
  245.         // Num 1  
  246.         Matrix matrixA = new Matrix();  
  247.         matrixA.reset();  
  248.         matrixA.setRotate(randomAngle());  
  249.         Bitmap bmNumA = Bitmap.createBitmap(getBitmapFromView(tvHideA, 2050), 002050, matrixA, true);  
  250.         ivNumA.setImageBitmap(bmNumA);  
  251.         // Num 2  
  252.         Matrix matrixB = new Matrix();  
  253.         matrixB.reset();  
  254.         matrixB.setRotate(randomAngle());  
  255.         Bitmap bmNumB = Bitmap.createBitmap(getBitmapFromView(tvHideB, 2050), 002050, matrixB, true);  
  256.         ivNumB.setImageBitmap(bmNumB);  
  257.         // Num 3  
  258.         Matrix matrixC = new Matrix();  
  259.         matrixC.reset();  
  260.         matrixC.setRotate(randomAngle());  
  261.         Bitmap bmNumC = Bitmap.createBitmap(getBitmapFromView(tvHideC, 2050), 002050, matrixC, true);  
  262.         ivNumC.setImageBitmap(bmNumC);  
  263.         // Num 4  
  264.         Matrix matrixD = new Matrix();  
  265.         matrixD.reset();  
  266.         matrixD.setRotate(randomAngle());  
  267.         Bitmap bmNumD = Bitmap.createBitmap(getBitmapFromView(tvHideD, 2050), 002050, matrixD, true);  
  268.         ivNumD.setImageBitmap(bmNumD);  
  269.     }  
  270.   
  271.     public int randomAngle() {  
  272.         return 20 * (new Random().nextInt(5) - new Random().nextInt(3));  
  273.     }  
  274.   
  275.     public int randomColor() {  
  276.         colorArray[0] = 0xFF000000// BLACK  
  277.         colorArray[1] = 0xFFFF00FF// MAGENTA  
  278.         colorArray[2] = 0xFFFF0000// RED  
  279.         colorArray[3] = 0xFF00FF00// GREEN  
  280.         colorArray[4] = 0xFF0000FF// BLUE  
  281.         colorArray[5] = 0xFF00FFFF// CYAN  
  282.         //colorArray[6] = 0xFFFFFF00; // YELLOW:看不清楚  
  283.   
  284.         int randomColorId = new Random().nextInt(6);  
  285.         return colorArray[randomColorId];  
  286.     }  
  287.   
  288.   
  289.     public static Bitmap getBitmapFromView(View view, int width, int height) {  
  290.         int widthSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);  
  291.         int heightSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);  
  292.         view.measure(widthSpec, heightSpec);  
  293.         view.layout(00, width, height);  
  294.         Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);  
  295.         Canvas canvas = new Canvas(bitmap);  
  296.         view.draw(canvas);  
  297.   
  298.         return bitmap;  
  299.     }  
  300.   
  301.   
  302.     @Override  
  303.     public boolean onCreateOptionsMenu(Menu menu) {  
  304.         // Inflate the menu; this adds items to the action bar if it is present.  
  305.         getMenuInflater().inflate(R.menu.main, menu);  
  306.         return true;  
  307.     }  
  308.   
  309.     @Override  
  310.     public boolean onOptionsItemSelected(MenuItem item) {  
  311.         // Handle action bar item clicks here. The action bar will  
  312.         // automatically handle clicks on the Home/Up button, so long  
  313.         // as you specify a parent activity in AndroidManifest.xml.  
  314.         int id = item.getItemId();  
  315.   
  316.         //noinspection SimplifiableIfStatement  
  317.         if (id == R.id.action_settings) {  
  318.             return true;  
  319.         }  
  320.         return super.onOptionsItemSelected(item);  
  321.     }  
  322.   
  323. }  


Main.xml:

[html]  view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  6.     android:paddingRight="@dimen/activity_horizontal_margin"  
  7.     android:paddingTop="@dimen/activity_vertical_margin"  
  8.     android:paddingBottom="@dimen/activity_vertical_margin"  
  9.     android:orientation="vertical"  
  10.     tools:context=".Main">  
  11.   
  12.     <TextView  
  13.         android:layout_width="wrap_content"  
  14.         android:text="锁定EditText内容:"  
  15.         android:layout_height="wrap_content" />  
  16.   
  17.     <LinearLayout  
  18.         android:layout_width="fill_parent"  
  19.         android:layout_height="wrap_content"  
  20.         android:orientation="horizontal">  
  21.   
  22.   
  23.         <EditText  
  24.             android:id="@+id/etLock"  
  25.             android:layout_width="200dp"  
  26.             android:layout_height="wrap_content" />  
  27.   
  28.         <Button  
  29.             android:id="@+id/btnLock"  
  30.             android:layout_width="wrap_content"  
  31.             android:layout_height="wrap_content"  
  32.             android:text="锁定" />  
  33.     </LinearLayout>  
  34.   
  35.     <TextView  
  36.         android:layout_marginTop="50dp"  
  37.         android:layout_width="wrap_content"  
  38.         android:layout_height="wrap_content"  
  39.         android:text="数字类型验证码:" />  
  40.   
  41.     <LinearLayout  
  42.         android:layout_width="fill_parent"  
  43.         android:layout_height="wrap_content"  
  44.         android:orientation="horizontal">  
  45.   
  46.         <LinearLayout  
  47.             android:orientation="horizontal"  
  48.             android:layout_width="wrap_content"  
  49.             android:layout_height="wrap_content">  
  50.   
  51.             <TextView  
  52.                 android:id="@+id/tvHideA"  
  53.                 android:layout_width="70dp"  
  54.                 android:layout_height="70dp"  
  55.                 android:textSize="30dp"  
  56.                 android:gravity="center"  
  57.                 android:visibility="gone" />  
  58.   
  59.             <TextView  
  60.                 android:id="@+id/tvHideB"  
  61.                 android:layout_width="70dp"  
  62.                 android:layout_height="70dp"  
  63.                 android:textSize="30dp"  
  64.                 android:gravity="center"  
  65.                 android:visibility="gone" />  
  66.   
  67.             <TextView  
  68.                 android:id="@+id/tvHideC"  
  69.                 android:layout_width="70dp"  
  70.                 android:layout_height="70dp"  
  71.                 android:textSize="30dp"  
  72.                 android:gravity="center"  
  73.                 android:visibility="gone" />  
  74.   
  75.             <TextView  
  76.                 android:id="@+id/tvHideD"  
  77.                 android:layout_width="70dp"  
  78.                 android:layout_height="70dp"  
  79.                 android:textSize="30dp"  
  80.                 android:gravity="center"  
  81.                 android:visibility="gone" />  
  82.         </LinearLayout>  
  83.   
  84.         <LinearLayout  
  85.             android:layout_width="wrap_content"  
  86.             android:orientation="horizontal"  
  87.             android:layout_height="wrap_content">  
  88.   
  89.             <ImageView  
  90.                 android:id="@+id/ivNumA"  
  91.                 android:layout_width="50dp"  
  92.                 android:layout_height="70dp" />  
  93.   
  94.             <ImageView  
  95.                 android:id="@+id/ivNumB"  
  96.                 android:layout_width="50dp"  
  97.                 android:layout_height="70dp" />  
  98.   
  99.             <ImageView  
  100.                 android:id="@+id/ivNumC"  
  101.                 android:layout_width="50dp"  
  102.                 android:layout_height="70dp" />  
  103.   
  104.             <ImageView  
  105.                 android:id="@+id/ivNumD"  
  106.                 android:layout_width="50dp"  
  107.                 android:layout_height="70dp" />  
  108.   
  109.   
  110.             <EditText  
  111.                 android:id="@+id/etCheck"  
  112.                 android:hint="验证码"  
  113.                 android:inputType="number"  
  114.                 android:layout_width="80dp"  
  115.                 android:layout_height="wrap_content" />  
  116.   
  117.             <Button  
  118.                 android:id="@+id/btnCheck"  
  119.                 android:layout_width="wrap_content"  
  120.                 android:layout_height="wrap_content"  
  121.                 android:text="确定" />  
  122.   
  123.             <TextView  
  124.                 android:id="@+id/tvCheck"  
  125.                 android:text="结果"  
  126.                 android:visibility="gone"  
  127.                 android:layout_width="wrap_content"  
  128.                 android:layout_height="wrap_content" />  
  129.         </LinearLayout>  
  130.   
  131.   
  132.     </LinearLayout>  
  133.   
  134.     <TextView  
  135.         android:layout_width="wrap_content"  
  136.         android:text="计算类型验证码:"  
  137.         android:layout_marginTop="50dp"  
  138.         android:layout_height="wrap_content" />  
  139.   
  140.     <LinearLayout  
  141.         android:layout_width="fill_parent"  
  142.         android:orientation="horizontal"  
  143.         android:layout_height="wrap_content">  
  144.   
  145.         <TextView  
  146.             android:id="@+id/tvHideE"  
  147.             android:visibility="gone"  
  148.             android:textSize="25dp"  
  149.             android:layout_width="wrap_content"  
  150.             android:layout_height="wrap_content" />  
  151.   
  152.         <TextView  
  153.             android:id="@+id/tvHideF"  
  154.             android:visibility="gone"  
  155.             android:textSize="30dp"  
  156.             android:layout_width="70dp"  
  157.             android:layout_height="wrap_content" />  
  158.   
  159.         <TextView  
  160.             android:id="@+id/tvHideG"  
  161.             android:visibility="gone"  
  162.             android:textSize="25dp"  
  163.             android:layout_width="wrap_content"  
  164.             android:layout_height="wrap_content" />  
  165.   
  166.   
  167.         <ImageView  
  168.             android:id="@+id/ivNumE"  
  169.             android:layout_width="50dp"  
  170.             android:layout_height="70dp" />  
  171.   
  172.         <ImageView  
  173.             android:id="@+id/ivNumF"  
  174.             android:layout_width="70dp"  
  175.             android:layout_height="70dp" />  
  176.   
  177.         <ImageView  
  178.             android:id="@+id/ivNumG"  
  179.             android:layout_width="50dp"  
  180.             android:layout_height="70dp" />  
  181.   
  182.         <EditText  
  183.             android:id="@+id/etVerify"  
  184.             android:hint="计算结果"  
  185.             android:inputType="numberSigned"  
  186.             android:layout_width="80dp"  
  187.             android:layout_height="wrap_content" />  
  188.   
  189.         <Button  
  190.             android:id="@+id/btnVerify"  
  191.             android:layout_width="wrap_content"  
  192.             android:layout_height="wrap_content"  
  193.             android:text="校验" />  
  194.   
  195.         <TextView  
  196.             android:layout_width="wrap_content"  
  197.             android:text="结果"  
  198.             android:visibility="gone"  
  199.             android:id="@+id/tvVerify"  
  200.             android:layout_height="wrap_content" />  
  201.   
  202.     </LinearLayout>  
  203. </LinearLayout>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序邦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值