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-10-10 17:41:12

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

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

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

[转] 关于 Eclipse 导出 Android项目 JavaDoc 详细过程

关于Eclipse 导出JavaDoc过程中,遇到的问题 ,google 了一下 ,网友们 总说不一 ,最终 还是 搞定了 现在分享给大家 希望对大家有所帮助 用Eclipse默认的 JavaDoc需要注意 有两个问题   1.   找不到关于Android相关的类   2. 不支持中文/乱码 , 后者是编码问题  编码 GBK 的不可映射字符   选中项目右键 --->Export--- 如图 点击 下一步 只需要 选择src 目录 点击 Next下一步 这儿 注意 两个问题 一个 是 编码问

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

MainActivity如下: package come.on; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; i

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之TextView 详细字典

TextView属性详解属性详解android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/phone/map/all)android:autoText如果设置,将自动执行输入值的拼写纠正.此处无效果,在显示输入法并输入的时候起作用.android:bufferType指定getText()方式取得的文本类别.选项editable 类似于StringBuilder可追加字符,也就是说getText后可调

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 BLE蓝牙详细解读

代码地址如下:http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能家具和玩具类产品.安卓4.3(API 18)为BLE的核心功能提供平台支持和API,App可以利用它来发现设备.查询服务和读写特性.相比传统的蓝牙,BLE更显著的特点是低功耗.本文主要讲解Android低功耗蓝牙的api使用以及蓝牙扫描.连接.发送数据.接收数据等一系列操作,并主要介绍本人封装的Ble

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

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

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

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