Android自定义View--验证码控件
来源:互联网 发布:apache 两个httpd.exe 编辑:程序博客网 时间:2024/06/06 07:33
运行效果:
该例子主要用了
1.自定义View的onDraw()方法
2.Utils类中的一些设置圆点,横线,数字坐标的方法
onDraw()绘图过程由ViewRoot对象的performTraversals()方法调用onDraw()方法发起绘制该View树,值得注意的是每次发起绘图时,并不会重新绘制每个View树的视图,而只会重新绘制那些“需要重绘”的视图,View类内部变量包含了一个标志位DRAWN,当该视图需要重绘时,就会为该View添加该标志位。但是onDraw()方法还是会调用,是否重绘还是要看标志位。
布局文件:
<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" tools:context=".MainActivity" > <com.example.checkview.widget.CheckView android:id="@+id/cv" android:layout_width="200dip" android:layout_height="50dip" /> <EditText android:id="@+id/et" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="验证" /> <Button android:id="@+id/button2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="刷新" /></LinearLayout>
Utils工具类:
private static int roundNum=10;//小圆点默认值 public static int getRoundNum() { return roundNum; } /** * 设置小圆点数量 * @param roundNum */ public static void setRoundNum(int roundNum) { CheckViewUtils.roundNum = roundNum; } public static int getCheckNumCount() { return checkNumCount; } /** * 设置验证码数量 * @param checkNumCount */ public static void setCheckNumCount(int checkNumCount) { CheckViewUtils.checkNumCount = checkNumCount; } private static int checkNumCount=4;//验证码位数 private static Random Rd=new Random(); /** * 获取验证码 * @return */ public static int[] getCheckNum(){ int[] checkNum=new int[checkNumCount]; for(int i=0;i<checkNumCount;i++){ checkNum[i]=(int)(Rd.nextInt(10)); } return checkNum; } /** * 获取圆点位置 * @param width * @param height * @return */ public static int[] getRound(int width,int height){ int[] roundArr={0,0}; roundArr[0]=(int)(Rd.nextInt(width)); roundArr[1]=(int)(Rd.nextInt(height)); return roundArr; } /** * 获取线条的起点和终点坐标 * @param width * @param height * @return */ public static int[] getLine(int width,int height){ int[] lineArr={0,0,0,0}; for(int i=0;i<4;i+=2){ lineArr[i]=(int)(Rd.nextInt(width)); lineArr[i+1]=(int)(Rd.nextInt(height)); } return lineArr; } /** * 验证是否通过 * @param numString 用户输入数字 * @param checkNum 验证的数字 * @return */ public static boolean validationNum(String numString,int[] checkNum){ if(numString.length()!=checkNumCount) return false; String checkNumString=""; for(int i=0;i<checkNumCount;i++){ checkNumString+=checkNum[i]; } if(checkNumString.equals(numString)){ return true; }else{ return false; } } /** * 获取Y点坐标 * @param height * @return */ public static int getY(int height){ int y=(int)(Rd.nextInt(height)); if(y>height-60){ y-=60; } if(y<60){ y+=60; } return y; }
自定义View:
public class CheckView extends View { private Paint paint=new Paint(); public int[] checkNum; public CheckView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub paint.setTextSize(60); paint.setStrokeWidth(6); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.BLUE); int width=getWidth(); int height=getHeight(); int checkNumX=40; if(checkNum==null){ canvas.drawText("请设置setCheckNum", checkNumX, CheckViewUtils.getY(height), paint); }else{ for(int i=0;i<CheckViewUtils.getCheckNumCount();i++){ canvas.drawText(checkNum[i]+"", checkNumX, CheckViewUtils.getY(height), paint); checkNumX+=width/5; } } for(int i=0;i<2;i++){ int[] line=CheckViewUtils.getLine(width, height);//获取线条起点和终点 canvas.drawLine(line[0], line[1], line[2], line[3], paint); } for(int i=0;i<10;i++){ int[] round=CheckViewUtils.getRound(width, height);//获取小圆点位置 canvas.drawPoint(round[0], round[1], paint); } } public int[] getCheckNum() {//获取验证码 return checkNum; } /** * 该方法必须被调用 * @param checkNum */ public void setCheckNum(boolean bl) { if(bl){ this.checkNum = CheckViewUtils.getCheckNum();//获取验证码 } } /** * 刷新验证码 * invalidate和postInvalidate方法会重新调用onDraw()方法 */ public void notifyDataSetChanged(){// invalidate(); setCheckNum(true); postInvalidate(); }}
MainActivity:
public class MainActivity extends Activity { private Button btnSubmit; private CheckView cv; private Button btnS; private EditText et; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSubmit=(Button) findViewById(R.id.button1); et=(EditText) findViewById(R.id.et); cv=(CheckView) findViewById(R.id.cv); cv.setCheckNum(true);//设置启用验证码数字,必须设置该属性 btnS=(Button) findViewById(R.id.button2); btnS.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub cv.notifyDataSetChanged(); } }); btnSubmit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String etString=et.getText().toString().trim(); int[] checkNum=cv.getCheckNum(); if(CheckViewUtils.validationNum(etString, checkNum)){ Toast.makeText(MainActivity.this, "验证通过", 1).show(); }else{ Toast.makeText(MainActivity.this, "验证失败", 1).show(); } } }); }}
源码下载:http://download.csdn.net/detail/qq1377399077/8672545
0 0
- Android自定义View--验证码控件
- Android自定义View入门之简单验证码控件
- Android自定义View 做个简单的验证码控件
- 自定义view之一:自定义验证码控件
- Android 自定义View (验证码)
- android 自定义控件以及自定义view学习(随机验证码生成)
- Android自定义控件(特效三) 自定义View实现图片验证码
- android 自定义控件以及自定义view学习(随机验证码生成)
- Android自定义View控件
- Android自定义View控件
- Android自定义View控件
- Android自定义View控件
- Android自定义View控件
- Android view 自定义控件
- Android 自定义控件-View
- Android自定义View(一)(验证码)
- Android自定义View实现验证码
- android 自定义View生成验证码
- 多线程 -- yield()方法和sleep()方法的区别
- 【学习笔记】JavaScript编码规范-类型
- 成绩管理系统
- 异常处理 Can't create handler inside thread that has not called Looper.prepare()
- SharePoint 2016 的新特性概览(一)(What's New for IT Professionals in SharePoint Server 2016)
- Android自定义View--验证码控件
- 陈怡暖:非农前或窄幅震荡走势
- Markdown 语法(0)- 序言
- C++中数字与字符串之间的转换
- 15年5月份笔记之刚接触开发板接口接线工具
- python对cookie的操作模块-cookielib
- 新硬盘挂载目录后文件消失解决办法
- eclipse导入android ware的sample 工程(gradle工程)
- 四种归一化方法