很多的AndroID入门程序猿来说对于AndroID自定义view,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义view上面花一些功夫,多写一些文章。
一、问题描述
熟悉web开发中童鞋们都知道为了防止恶意破解、恶意提交、刷票等我们在提交表单数据时,都会使用随机验证码功能。在AndroID应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个随机验证码VIEw控件实现这一需求,并且具备通用性,需要的时候在界面中直接加入这个VIEw组件即可。
二、案例介绍
案例运行效果
案例所涉及组件
1、CheckVIEw 自定义的验证码控件,主要重写onDraw方法实现图形绘制
2、Config:用于对验证码控件参数的配置,像画点点数、划线数、背景颜色的设置
3、CheckUtil:验证码相关工具类,实现例如随机的点坐标、随机线段起始和结束点坐标、验证码校验等功能
4、MainActivity:测试应用
三、功能实现
1、编写Config组件
/*** 功能:用于对验证码控件参数的配置* */public class Config {// 验证码更新时间public static final int PTEDE_TIME = 1200;// 点数设置public static final int POINT_NUM = 100;// 线段数设置public static final int liNE_NUM = 2;//设置背景颜色public static final int color=color.BLUE;//随机数据长度public static int TEXT_LENGTH=4;//设置验证码字体大小public static int TEXT_SIZE=30;}2、CheckUtil组件/*** 功能:验证码相关工具类* */public class CheckUtil{/*** 产生随机数字* @return*/public static int [] getCheckNum(){int [] tempCheckNum = new int[Config.TEXT_LENGTH];for(int i = 0; i < Config.TEXT_LENGTH; i++){tempCheckNum[i] = (int) (Math.random() * 10);}return tempCheckNum;}/*** 随机产生划线的起始点坐标和结束点坐标* @param height 传入CheckVIEw的高度值* @param wIDth 传入CheckVIEw的宽度值* @return 起始点坐标和结束点坐标*/public static int[] getline(int height,int wIDth){int [] tempCheckNum = {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;}/*** 随机产生点的圆心点坐标* @param height 传入CheckVIEw的高度值* @param wIDth 传入CheckVIEw的宽度值* @return*/public static int[] getPoint(int height,0};tempCheckNum[0] = (int) (Math.random() * wIDth);tempCheckNum[1] = (int) (Math.random() * height);return tempCheckNum;}/*** 验证是否正确* @param userCheck 用户输入的验证码* @param checkNum 验证控件产生的随机数* @return*/public static boolean checkNum(String userCheck,int[] checkNum){if(userCheck.length() != 4 ){ return false;}String checkString = "";for (int i = 0; i < 4; i++) {checkString += checkNum[i];}if(userCheck.equals(checkString)){return true;}else {return false;}}/*** 计算验证码的绘制y点位置* @param height 传入CheckVIEw的高度值* @return*/public static int getPositon(int height){int tempPositoin = (int) (Math.random() * height);if(tempPositoin < 20){tempPositoin += 20;}return tempPositoin;}}
3、自定义验证码控件CheckVIEw
public class CheckVIEw extends VIEw{Context mContext;int [] CheckNum = null;Paint mTempPaint = new Paint();// 验证码public CheckVIEw(Context context,AttributeSet attrs) {super(context,attrs);mContext = context;mTempPaint.setAntiAlias(true);mTempPaint.setTextSize(Config.TEXT_SIZE);mTempPaint.setstrokeWIDth(3);}public voID onDraw(Canvas canvas){canvas.drawcolor(Config.color);final int height = getHeight();//获得CheckVIEw控件的高度final int wIDth = getWIDth();//获得CheckVIEw控件的宽度int dx = 40;for(int i = 0; i < 4; i ++){//绘制验证控件上的文本canvas.drawText("" + CheckNum[i],dx,CheckUtil.getPositon(height),mTempPaint);dx += wIDth/ 5;}int [] line;for(int i = 0; i < Config.liNE_NUM; i ++){//划线line = CheckUtil.getline(height,wIDth);canvas.drawline(line[0],line[1],line[2],line[3],mTempPaint);}// 绘制小圆点int [] point;for(int i = 0; i < Config.POINT_NUM; i ++) {//画点point=CheckUtil.getPoint(height,wIDth);canvas.drawCircle(point[0],point[1],1,mTempPaint);}}public voID setCheckNum(int [] chenckNum) {//设置验证码CheckNum = chenckNum;}public int[] getCheckNum() {//获得验证码return CheckNum;}public voID invaliChenkNum() {invalIDate();}}
4、编写MainActivity测试代码
public class MainActivity extends Activity implements VIEw.OnClickListener{private CheckAction mCheckVIEw ;private TextVIEw mShowPassViwe;private EditText mEditPass;private button msubmit;private button mRef;// 验证码:private int [] checkNum =null;public voID onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentVIEw(R.layout.main); initVIEw();initCheckNum();}public voID initVIEw(){mCheckVIEw = (CheckVIEw) findVIEwByID(R.ID.checkVIEw);mShowPassViwe = (TextVIEw) findVIEwByID(R.ID.checkpass);mEditPass = (EditText) findVIEwByID(R.ID.checkTest);msubmit = (button) findVIEwByID(R.ID.submit);mRef = (button) findVIEwByID(R.ID.ref);msubmit.setonClickListener(this);mRef.setonClickListener(this);}// 初始化验证码并且刷新界面public voID initCheckNum(){checkNum = CheckUtil.getCheckNum();mCheckVIEw.setCheckNum(checkNum);mCheckVIEw.invaliChenkNum();}public voID onClick(VIEw v) {switch (v.getID()){ case R.ID.submit:String userinput = mEditPass.getText().toString();if(CheckUtil.checkNum(userinput,checkNum)){setPassstring("通过");Toast.makeText(this,"通过",1200).show();}else{setPassstring("未通过");Toast.makeText(this,"未通过",1200).show();}break;case R.ID.ref:initCheckNum();break;default:break;}}public voID setPassstring(String passstring) {mShowPassViwe.setText(passstring);}}
以上所述是针对AndroID通过自定义view实现随机验证码的相关知识,希望对大家有所帮助!
总结以上是内存溢出为你收集整理的Android通过自定义View实现随机验证码全部内容,希望文章能够帮你解决Android通过自定义View实现随机验证码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)