安卓生成验证码

本地生成验证码,原理很简单,就是写一个数组,从里面随机出几个元素来,画在图片上即可

以下为代码:

public class Code {
private static final char[] CHAR = { //验证码数组
'1','2', '3', '4', '5', '6', '7', '8', '9',
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm',
        'n', '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', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
};
private static Code code; //单例
private Random random = new Random();
private String strCode; //验证码
private int  paddint_left ;
private int  paddint_top ;
private Code() {
super();
}
public static Code getInstance(){
if(code==null){
code = new Code();
}
return code;
}
public String getCode(){
return strCode;
}
// 生成验证码图片
public  Bitmap createBitmap(){
paddint_left = 0;
// 画图片 
Bitmap bitmap = Bitmap.createBitmap(100, 50, Config.ARGB_4444);
strCode = randomCode(4);//生成一个4位的验证码
Paint p = new Paint();//创建画笔
Canvas c = new Canvas(bitmap);//创建画板
c.drawColor(Color.WHITE); //图片背景色
p.setTextSize(25); //设置验证码字体的大小

// 画验证码
for (int i = 0; i < strCode.length(); i++) {
randomPadding();
randomTextStyle(p); //设置验证码样式
c.drawText(strCode.charAt(i)+"", paddint_left, paddint_top, p);
}
// 画随机线条
for(int i=0;i<4;i++){
drawLine(c, p);
}
c.save(Canvas.ALL_SAVE_FLAG );//保存
         c.restore();//
return bitmap;
}
// 随机生成一个4位的随机验证码
private String randomCode(int number){
StringBuilder builder = new StringBuilder();
for(int i=0;i<number;i++){
builder.append(CHAR[random.nextInt(CHAR.length)]);
}
return builder.toString();
}
// 画干扰线
private void drawLine(Canvas canvas,Paint paint){
int color =randomColor();
paint.setColor(color);
paint.setStrokeWidth(1); //设置线条的宽度
canvas.drawLine(random.nextInt(100), random.nextInt(50),
random.nextInt(100), random.nextInt(50), paint);
}
// 验证码字体的样式
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); //设置字体的亲写方向, 正数表示左斜,负数有斜
paint.setUnderlineText(random.nextBoolean()); //设置下划线
paint.setStrikeThruText(random.nextBoolean());//设置删除线
}
// 随机生成验证码的颜色
private int randomColor(){
int red = random.nextInt(256);
int green = random.nextInt(256);
int blue = random.nextInt(256);
return Color.rgb(red, green, blue);
}
// 随机生成验证码的padding值
private void randomPadding(){
paddint_left += 10 + random.nextInt(15);
paddint_top  = 15 + random.nextInt(10);
}


MainActivity部分:  


public class MainActivity extends Activity implements OnClickListener {


private Button bt;
private ImageView iv;
private EditText et;
private Code code = Code.getInstance();


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et);
bt = (Button) findViewById(R.id.bt);
iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(code.createBitmap());
bt.setOnClickListener(this);
iv.setOnClickListener(this);
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv: //点击验证码的图片刷新验证码
iv.setImageBitmap(code.createBitmap());
System.out.println(code.getCode());
break;
case R.id.bt: //提交验证码 
String text = et.getText().toString().toLowerCase();
String codeString = code.getCode().toLowerCase();
if(codeString.equals(text)){
Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
}


UI写的很丑。主要看效果了

<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.itheima.practice_securitycode.MainActivity" 
    android:orientation="vertical">
    <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">


<EditText
   android:id="@+id/et"
   android:layout_width="150dp"
   android:layout_height="wrap_content"
   android:hint="请输入验证码"
   android:background="@drawable/security"/>


    <ImageView 
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        />
    </LinearLayout>
    <Button
        android:id="@+id/bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="提交"
        android:layout_gravity="center_horizontal"/>
</LinearLayout>


里面用到了自定义的shape图样

<shape xmlns:android="http://schemas.android.com/apk/res/android" >
     <solid android:color="#ffffff" /> 
    <stroke android:width="0.1dip" android:color="#ed6d48" />  
    <corners android:radius="5dp"/>
</shape>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值