天天看點

Android生成驗證碼

先放上這個小Demo的圖檔:點選圖檔可以更換新的驗證碼。

Android生成驗證碼

驗證碼是以圖檔的形式顯示的,是以需要寫一個自定義驗證碼控件

public class ValidateView extends View {

	/**
	 * 點數
	 */
	private int pointNum = 150;// 背景雜質
	/**
	 * 線段數
	 */
	private int lineNum = 3;// 背景雜質
	/**
	 * 驗證碼字長
	 */
	private int validateCodeLenght = 6;// 預設長度為6
	/**
	 * 驗證碼
	 */
	private String[] validateCode;
	private Paint mTempPaint = new Paint();
	private Context mContext;

	/**
	 * 驗證碼内容
	 */
	private static final String[] strContent = new String[] { "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" };

	public ValidateView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		mTempPaint.setAntiAlias(true);
		mTempPaint.setTextSize(50);
		mTempPaint.setStrokeWidth(3);
		validateCode = new String[validateCodeLenght];// 驗證碼
	}

	public String[] getValidateCode() {
		return validateCode;
	}

	public void setValidateCode(String[] validateCode) {
		this.validateCode = validateCode;
	}

	public void onDraw(Canvas canvas) {
		canvas.drawColor(Color.GREEN);

		// 繪制驗證碼
		final int height = getHeight();
		final int width = getWidth();
		int dx = 30;

		for (int i = 0; i < validateCodeLenght; i++) {
			canvas.drawText("" + validateCode[i], dx, getPositon(height), mTempPaint);
			dx += width / (validateCodeLenght + 1);
		}
		int[] line;

		for (int i = 0; i < lineNum; i++) {
			line = getLine(height, width);
			canvas.drawLine(line[0], line[1], line[2], line[3], mTempPaint);
		}
		// 繪制小圓點
		int[] point;
		for (int i = 0; i < pointNum; i++) {
			point = getPoint(height, width);
			canvas.drawCircle(point[0], point[1], 1, mTempPaint);
		}
	}

	/**
	 * 更新驗證碼顯示
	 */
	public void invaliChenkNum() {
		invalidate();
	}

	/**
	 * 生成驗證碼,并顯示在圖檔上
	 * 
	 * @return
	 */
	public String[] createAndSetValidateCode() {
		String[] tempValidateCode = new String[validateCodeLenght];
		for (int i = 0; i < validateCodeLenght; i++) {
			tempValidateCode[i] = strContent[(int) (Math.random() * strContent.length)];
		}
		validateCode = tempValidateCode;
		return tempValidateCode;
	}

	/**
	 * 生成驗證碼
	 * 
	 * @return
	 */
	public String[] createCheckNum() {
		String[] tempCheckNum = new String[validateCodeLenght];
		for (int i = 0; i < validateCodeLenght; i++) {
			tempCheckNum[i] = strContent[(int) (Math.random() * strContent.length)];
		}
		return tempCheckNum;
	}

	private int[] getLine(int height, int width) {
		int[] tempCheckNum = new int[validateCodeLenght];
		for (int i = 0; i < validateCodeLenght; i += 2) {
			tempCheckNum[i] = (int) (Math.random() * width);
			tempCheckNum[i + 1] = (int) (Math.random() * height);
		}
		return tempCheckNum;
	}

	private int[] getPoint(int height, int width) {
		int[] tempCheckNum = new int[validateCodeLenght];
		tempCheckNum[0] = (int) (Math.random() * width);
		tempCheckNum[1] = (int) (Math.random() * height);
		return tempCheckNum;
	}

	/**
	 * 驗證是否正确,單元測試通過
	 * 
	 * @param userCheck
	 *            使用者輸入的驗證碼
	 * @param ValidateCode
	 *            自動生成的驗證碼
	 * @return
	 */
	public boolean validateCode(String userCheck, String[] code) {
		if (userCheck.length() != validateCodeLenght) {
			return false;
		}
		String checkString = "";
		for (int i = 0; i < validateCodeLenght; i++) {
			checkString += code[i];
		}
		if (userCheck.equals(checkString)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 擷取驗證碼的縱坐标
	 * 
	 * @param height
	 * @return
	 */
	public int getPositon(int height) {
		int tempPositoin = (int) (Math.random() * height);
		if (tempPositoin < 25) {
			tempPositoin += 25;
		}
		return tempPositoin;
	}

	public int getPointNum() {
		return pointNum;
	}

	public void setPointNum(int pointNum) {
		this.pointNum = pointNum;
	}

	public int getLineNum() {
		return lineNum;
	}

	public void setLineNum(int lineNum) {
		this.lineNum = lineNum;
	}

	public int getValidateCodeLenght() {
		return validateCodeLenght;
	}

	public void setValidateCodeLenght(int validateCodeLenght) {
		this.validateCodeLenght = validateCodeLenght;
		validateCode = new String[validateCodeLenght];// 驗證碼
	}

}
           

簡單的XML布局:

<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:gravity="center_horizontal"
    android:orientation="vertical" >

    <com.example.validateviewdemo.ValidateView
        android:id="@+id/validateView"
        android:layout_width="180dp"
        android:layout_height="50dp" />

</LinearLayout>
           

實作簡單的功能:

public class MainActivity extends Activity {

	ValidateView validateView;
	private static final int LENGHT = 6;//驗證碼的長度
	private String[] code = new String[LENGHT];//驗證碼

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		validateView = (ValidateView) findViewById(R.id.validateView);
		validateView.setValidateCodeLenght(LENGHT);
		code = validateView.createAndSetValidateCode();
		validateView.setOnClickListener(new OnClickListener() {
			// 點選圖檔,更換驗證碼
			@Override
			public void onClick(View arg0) {
				code = validateView.createAndSetValidateCode();
				validateView.invalidate();
			}
		});
	}
}
           

一般使用方式都是擷取自動生成的驗證碼,再從輸入框擷取使用者輸入的驗證碼,互相比對就可以得出結果。

資源下載下傳: http://download.csdn.net/detail/u014375869/8975017