android 验证码实现,详细标注!

转载请注明出处:王亟亟的大牛之路

上一篇博文写了一个生成二维码的,这一篇来一个随机数的。
包目录

运行效果:

就是画了一串东西然后放入imageview
话不多说直接上代码:

public class MainActivity extends Activity {
    ProgressDialog mLoadingDialog;
    Button ShowCAPTCHAD;
    ImageView imageview;
    Bitmap validateCodeImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageview=(ImageView)findViewById(R.id.imageview);
        ShowCAPTCHAD=(Button)findViewById(R.id.ShowCAPTCHAD);
        ShowCAPTCHAD.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                showLoadingDialog("Loading......");
                //回收bitmap
                if(null != validateCodeImage && !validateCodeImage.isRecycled()){
                    validateCodeImage.recycle();
                    validateCodeImage = null;
                }
                //生成图片
                validateCodeImage =makeValidateCode(200, 70);
                imageview.setImageBitmap(validateCodeImage);
                Toast.makeText(MainActivity.this, "验证码生成成功"+"验证码是"+gainValidateCodeValue(), Toast.LENGTH_SHORT).show();
                dismissLoadingDialog();
            }
        });
    }

    /*显示对话框*/
    public void showLoadingDialog(String msg) {
        if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
            return;
        }
        mLoadingDialog = new ProgressDialog(this);
        mLoadingDialog.setMessage(msg);
        // mLoadingDialog.setOnKeyListener(mOnKeyListener);
        // mLoadingDialog.setCancelable(false);
        mLoadingDialog.show();
    }

    /**
     * 取消加载对话框
     */
    public void dismissLoadingDialog() {
        if (mLoadingDialog != null) {
            mLoadingDialog.dismiss();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * 获取验证码图片
     * @param width 验证码宽度
     * @param height 验证码高度
     * @return 验证码Bitmap对象
     */
    public synchronized static Bitmap makeValidateCode(int width, int height){
        return ValidateCodeGenerator.createBitmap(width, height);
    }

    /**
     * 获取验证码值
     * @return 验证码字符串
     */
    public synchronized static String gainValidateCodeValue(){
        return ValidateCodeGenerator.getCode();
    }

    /**
     * 随机生成验证码内部类
     *
     */
    final static class ValidateCodeGenerator{
        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',
        };

        //default settings
        private static final int DEFAULT_CODE_LENGTH = 4;
        private static final int DEFAULT_FONT_SIZE = 30;
        private static final int DEFAULT_LINE_NUMBER =3;//杂乱线的条数
        private static final int BASE_PADDING_LEFT = 15, RANGE_PADDING_LEFT = 10, BASE_PADDING_TOP = 35, RANGE_PADDING_TOP = 20;
        private static final int DEFAULT_WIDTH = 60, DEFAULT_HEIGHT = 30;

        //variables
        private static String value;
        private static int padding_left, padding_top;
        private static Random random = new Random();

        public static Bitmap createBitmap(int width,int height) {
            padding_left = 0;
            //创建画布
            Bitmap bp = Bitmap.createBitmap(width, height, Config.ARGB_8888);
            Canvas c = new Canvas(bp);

            //随机生成验证码字符
            StringBuilder buffer = new StringBuilder();
            for (int i = 0; i < DEFAULT_CODE_LENGTH; i++) {
                buffer.append(CHARS[random.nextInt(CHARS.length)]);
            }
            value = buffer.toString();

            //设置颜色
            c.drawColor(Color.WHITE);

            //设置画笔大小
            Paint paint = new Paint();
            paint.setTextSize(DEFAULT_FONT_SIZE);
            for (int i = 0; i < value.length(); i++) {
                //随机样式
                randomTextStyle(paint);
                padding_left += BASE_PADDING_LEFT + random.nextInt(RANGE_PADDING_LEFT);
                padding_top = BASE_PADDING_TOP + random.nextInt(RANGE_PADDING_TOP);
                c.drawText(value.charAt(i) + "", padding_left, padding_top, paint);
            }
            for (int i = 0; i < DEFAULT_LINE_NUMBER; i++) {
                drawLine(c, paint);
            }
            //保存
            c.save(Canvas.ALL_SAVE_FLAG);
            c.restore();

            return bp;
        }

        public static String getCode() {
            return value;
        }

        private static void randomTextStyle(Paint paint) {
            int color = randomColor(1);
            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 static void drawLine(Canvas canvas, Paint paint) {
            int color = randomColor(1);
            int startX = random.nextInt(DEFAULT_WIDTH);
            int startY = random.nextInt(DEFAULT_HEIGHT);
            int stopX = random.nextInt(DEFAULT_WIDTH);
            int stopY = random.nextInt(DEFAULT_HEIGHT);
            paint.setStrokeWidth(1);
            paint.setColor(color);
            canvas.drawLine(startX, startY, stopX, stopY, paint);
        }

        private static 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);
        }
    }

    @Override
    protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    if(null != validateCodeImage && !validateCodeImage.isRecycled()){
        validateCodeImage.recycle();
        validateCodeImage = null;
        }
    System.gc();
    }
}

布局文件:

<RelativeLayout 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.example.captchademo.MainActivity" >

    <Button
        android:id="@+id/ShowCAPTCHAD"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="ShowCAPTCHAD" />

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/ShowCAPTCHAD"
        android:layout_centerHorizontal="true"
        android:minHeight="150dp" />

</RelativeLayout>

想要修改属性都可以在内部类操作。
源码地址:http://yunpan.cn/cd8R7TMTtWDwq 访问密码 8a95

时间: 2024-09-25 23:30:32

android 验证码实现,详细标注!的相关文章

Android ListView和Fragment结合使用,类似于某电商的实现,拿来就能用,详细标注适合新手

转载请注明出处王亟亟的大牛之路 一个类似于某电商的实现,让菜鸟们理解Activity与Fragment之间的参数是如何交互的. 包结构: 运行后的效果 分析: 左侧ListView可上下拖动,点击不同的item会影响右侧Fragment的内容. 废话不多说,上代码(详细标注) MainActivity public class MainActivity extends FragmentActivity implements OnItemClickListener { /*ListView填充用*

CentOS Linux系统搭建Android开发环境详细介绍_Linux

CentOS Linux系统搭建Android开发环境详细介绍        很多人都是在Windows下进行Android开发,但是对于Linux,Android开发环境方面的资料比较少,今天在网上找到了一位网友分享的在CentOS Linux系统中搭建Android开发环境的过程.下面就是其介绍的配置的详细步骤原文:        由于我最近每天使用的是CentOS 5.5,所以选择CentOS5.5作为我的开发环境.        主要包括以下步骤: 1.JDK安装 2.Eclipse安装

Android 验证码功能实现代码_Android

先给大家展示下效果图,如果大家感觉还不错,请参考实现代码 很简单的一个例子,点击刷新验证码,刷新当前显示的验证码,点击确定,如果输入的和显示的匹配,就会跳转到下一个界面中,这里只是实现了跳转,并没有进行其它的操作 好了 接下来就是代码了 首先看MainActivity的布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sche

Android清理设备内存详细完整示例(二)

MainActivity如下: package cc.c; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo;

简单实现Android验证码_Android

安卓验证码的简单实现 我们经常在登录或者注册的时候要求输入验证码,这里简单介绍一下一种方法 效果如下 首先是要获取 随机的四个字母组合,我这里是将26个字母存储到一个数组中,然后随机生成4个下标值,取这四个下标值对应的字母作为验证码. public class RandomChars { char[] chars; public RandomChars() { chars = new char[26]; for (int i = 0; i < 26; i++) { chars[i] = (cha

Android自定义控件属性详细介绍

Android自定义控件属性详细介绍 1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> <attr name = "background" format = "reference" /> </declare-styleable> (2)属性使用: <ImageView android:layout_width = "4

android 轻量级的友好的交互对话框库,EasyDialog,实现已详细标注

转载请注明出处:王亟亟的大牛之路 Git上看到的一个蛮清爽的一个Dialog介绍给大家,Git地址 实现效果 个人感觉做的还是满Q弹的 如何使用? compile 'com.github.michaelye.easydialog:easydialog:1.0' 其实也就是一个类和几个layout文件,建议直接copy进你的项目还更方便点. 项目结构: 因为标注的很清晰,直接就贴代码看,不做什么解释了,如有什么不理解可以留言可以回答你的问题 核心类EasyDialog public class E

android 粗暴简单仿美团/大众点评搜索方式,详细标注

转载请注明出处王亟亟的大牛之路 美团和大众点评的搜索和筛选栏,不能说好看(审美flag),但是满足了我们的搜索还筛选的需求,所以今天就实现了下这样的一个小Demo 项目结构:运行效果就是下图了,就不再截图了 初始化的样子: 具体实现就是起初3个LinearLayout,点击之后出现一个ListView然后会根据对这个LisvView的点击可能会再出现下一级别的子菜单. 废话不多说,直接上代码 MainActivity public class MainActivity extends Activ

Android验证码的生成与验证

1.生成验证码   package com.medees.dazhima_android; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import java.util.Random; /**  *  * Created by root on 14-7-10.  *  * 绘制注册界面验证码