zoukankan      html  css  js  c++  java
  • android client随机验证码生成函数

              由于该项目使用验证码。自己找了一些资料。尽量把这个验证码做出来。代码不是很,較的简单,以下给大家看看我是怎么实现该功能的:

     

    源代码地址下载http://download.csdn.net/detail/u014608640/7268905

    首先当然是写XML咯,贴上代码

     <LinearLayout 
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="horizontal"
           android:id="@+id/yh"
           >
           
           <TextView 
               android:text="username:"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               />
           
           <EditText 
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               />
           
       </LinearLayout>
       
       
       
       <LinearLayout 
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="horizontal"
           android:layout_below="@id/yh"
           android:id="@+id/pwd"
           >
           
           <TextView 
               android:text="password:"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               />
           
           <EditText 
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               />
           
       </LinearLayout>
    
       
       <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center_vertical"
                    android:layout_marginTop="4dp"
                    android:orientation="horizontal"
                    android:layout_below="@id/pwd"
                    android:id="@+id/code"
                     >
    
                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="10dp"
                        android:layout_marginLeft="10dp"
                        android:layout_marginRight="10dp"
                        android:layout_marginTop="5dp"
                        android:orientation="horizontal" >
    
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="20dp"
                            android:layout_marginRight="5dp"
                            android:text="验 证 码:"
                            android:textColor="#000000" />
    
                        <EditText
                            android:id="@+id/vc_code"
                            android:layout_width="60dp"
                            android:layout_height="wrap_content"
                            android:layout_weight="1"
                            android:background="#0000"
                            android:maxLength="4"
                            android:paddingBottom="10dp"
                            android:paddingLeft="10dp"
                            android:paddingTop="10dp"
                            android:textColor="#000000"
                            android:textSize="14sp" />
                    </LinearLayout>
    
                    <ImageView
                        android:id="@+id/vc_image"
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:layout_marginBottom="10dp"
                        android:layout_marginTop="5dp"
                        android:layout_weight="1" />
    
                    <Button
                        android:id="@+id/vc_shuaixi"
                        android:layout_width="40dp"
                        android:layout_height="wrap_content"
                        android:background="@android:color/transparent"
                        android:layout_gravity="center_vertical"
                        android:text="刷新验证码"
                        android:textStyle="italic"
                        android:layout_marginTop="5dp"
                        android:layout_marginBottom="10dp"
                        android:layout_marginLeft="5dp"
                        android:layout_marginRight="5dp"
                        android:textColor="#7f7f7f"
                        android:textSize="12sp" />
                </LinearLayout>
       
       <LinearLayout 
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_below="@id/code"
           android:orientation="horizontal"
           >
           <Button 
               android:id="@+id/vc_ok"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:text="确定"
               />
           
       </LinearLayout>


    以下贴一下MainActivity的代码:

    里面的凝视非常具体。就不多说了!

    import android.os.Bundle;
    import android.app.Activity;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    	
        ImageView vc_image; //图标
        Button vc_shuaixi,vc_ok; //确定和刷新验证码
        String getCode=null; //获取验证码的值
        EditText vc_code; //文本框的值
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		vc_image=(ImageView)findViewById(R.id.vc_image);
    		vc_image.setImageBitmap(Code.getInstance().getBitmap());
    		vc_code=(EditText) findViewById(R.id.vc_code);
    		
    		getCode=Code.getInstance().getCode(); //获取显示的验证码
    		Log.e("info", getCode+"----");
    		vc_shuaixi=(Button)findViewById(R.id.vc_shuaixi);
    		vc_shuaixi.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				vc_image.setImageBitmap(Code.getInstance().getBitmap());
    				getCode=Code.getInstance().getCode();
    			}
    		});
    		
    		vc_ok=(Button)findViewById(R.id.vc_ok);
    		vc_ok.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    			String	v_code=vc_code.getText().toString().trim();
    			if(v_code==null||v_code.equals("")){
    				Toast.makeText(MainActivity.this, "没有填写验证码", 2).show();
    			}else if(!v_code.equals(getCode)){
    				Toast.makeText(MainActivity.this, "验证码填写不对", 2).show();
    			}else{
    				Toast.makeText(MainActivity.this, "操作成功", 2).show();
    			}
    			
    			}
    		});
    		
    	}
    


    最后贴一下做验证码必须的一个类Code:

    import java.util.Random;
    
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Bitmap.Config;
    
    
    public class Code {
    
    	private static final char[] CHARS = {
    		'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    		'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
    		'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
    		'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
    		'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
    	};
    	
    	private static Code bpUtil;
    	private Code(){};
    	public static Code getInstance() {
    		if(bpUtil == null)
    			bpUtil = new Code();
    		return bpUtil;
    	}
    	//default settings
    	private static final int DEFAULT_CODE_LENGTH = 4;//验证码的长度  这里是4位
    	private static final int DEFAULT_FONT_SIZE = 60;//字体大小
    	private static final int DEFAULT_LINE_NUMBER = 3;//多少条干扰线
    	private static final int BASE_PADDING_LEFT = 20; //左边距
    	private static final int RANGE_PADDING_LEFT = 35;//左边距范围值  
    	private static final int BASE_PADDING_TOP = 42;//上边距
    	private static final int RANGE_PADDING_TOP = 15;//上边距范围值
    	private static final int DEFAULT_WIDTH = 200;//默认宽度.图片的总宽
    	private static final int DEFAULT_HEIGHT = 70;//默认高度.图片的总高
    	private  final int DEFAULT_COLOR=0xdf;//默认背景颜色值
    	
    	//settings decided by the layout xml
    	//canvas width and height
    	private int width = DEFAULT_WIDTH;
    	private int height = DEFAULT_HEIGHT; 
    	
    	//random word space and pading_top
    	private int base_padding_left = BASE_PADDING_LEFT;
    	private int range_padding_left = RANGE_PADDING_LEFT;
    	private int base_padding_top = BASE_PADDING_TOP;
    	private int range_padding_top = RANGE_PADDING_TOP;
    	
    	//number of chars, lines; font size
    	private int codeLength = DEFAULT_CODE_LENGTH;
    	private int line_number = DEFAULT_LINE_NUMBER;
    	private int font_size = DEFAULT_FONT_SIZE;
    	
    	//variables
    	private String code;//保存生成的验证码
    	private int padding_left, padding_top;
    	private Random random = new Random();
    	
    	private Bitmap createBitmap() {
    		padding_left = 0;
    		
    		Bitmap bp = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
    		Canvas c = new Canvas(bp);
    
    		code = createCode();
    		
    		c.drawColor(Color.rgb(DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_COLOR));
    		Paint paint = new Paint();
    		paint.setTextSize(font_size);
    		
    		for (int i = 0; i < code.length(); i++) {
    			randomTextStyle(paint);
    			randomPadding();
    			c.drawText(code.charAt(i) + "", padding_left, padding_top, paint);
    		}
    
    		for (int i = 0; i < line_number; i++) {
    			drawLine(c, paint);
    		}
    		
    		c.save( Canvas.ALL_SAVE_FLAG );//保存  
    		c.restore();//
    		return bp;
    	}
    	
    	public String getCode() {
    		return code.toLowerCase();
    	}
    	
    	public Bitmap getBitmap(){
    		return createBitmap();
    	}
    	private String createCode() {
    		StringBuilder buffer = new StringBuilder();
    		for (int i = 0; i < codeLength; i++) {
    			buffer.append(CHARS[random.nextInt(CHARS.length)]);
    		}
    		return buffer.toString();
    	}
    	
    	private void drawLine(Canvas canvas, Paint paint) {
    		int color = randomColor();
    		int startX = random.nextInt(width);
    		int startY = random.nextInt(height);
    		int stopX = random.nextInt(width);
    		int stopY = random.nextInt(height);
    		paint.setStrokeWidth(1);
    		paint.setColor(color);
    		canvas.drawLine(startX, startY, stopX, stopY, paint);
    	}
    	
    	private int randomColor() {
    		return randomColor(1);
    	}
    
    	private int randomColor(int rate) {
    		int red = random.nextInt(256) / rate;
    		int green = random.nextInt(256) / rate;
    		int blue = random.nextInt(256) / rate;
    		return Color.rgb(red, green, blue);
    	}
    	
    	private void randomTextStyle(Paint paint) {
    		int color = randomColor();
    		paint.setColor(color);
    		paint.setFakeBoldText(random.nextBoolean());  //true为粗体,false为非粗体
    		float skewX = random.nextInt(11) / 10;
    		skewX = random.nextBoolean() ? skewX : -skewX;
    		paint.setTextSkewX(skewX); //float类型參数,负数表示右斜。整数左斜
    //		paint.setUnderlineText(true); //true为下划线,false为非下划线
    //		paint.setStrikeThruText(true); //true为删除线,false为非删除线
    	}
    	
    	private void randomPadding() {
    		padding_left += base_padding_left + random.nextInt(range_padding_left);
    		padding_top = base_padding_top + random.nextInt(range_padding_top);
    	}
    }


    代码已经贴完成。能够试着做一下。

     

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    集合改变时会自动通知的集合类
    WPF中的MatrixTransform
    WPF中,如何将Vista Aero效果扩展到整个窗口
    WPF中的命令与命令绑定(二)
    参加BEA Dev2Dev TechDays 归来
    在WPF中自定义你的绘制(五)
    Microsoft Surface
    WPF与缓动(二) 正弦与余弦缓动
    WPF与缓动(一) N次缓动
    终于找到了一个WPF中的日历控件
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4660970.html
Copyright © 2011-2022 走看看