zoukankan      html  css  js  c++  java
  • (五十一)生成图片验证码的代码如下所示

    1、程序的结构如下所示:

    2、LoginImageViewCode.java的代码如下所示

    package com.app.code;
    import java.util.Random;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.Config;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    
    public class LoginImageViewCode {
    
        private static Context context;
    
        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 LoginImageViewCode bpUtil;
    
        private LoginImageViewCode(Context context) {
            this.context = context;
        };
    
        public static LoginImageViewCode getInstance(Context context) {
            if (bpUtil == null)
                bpUtil = new LoginImageViewCode(context);
            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 = 4;// 多少条干扰线
        private static final int BASE_PADDING_LEFT = 20; // 左边距
        private static final int RANGE_PADDING_LEFT = 15;// 左边距范围值
        private static final int BASE_PADDING_TOP = 42;// 上边距
        private static final int RANGE_PADDING_TOP = 28;// 上边距范围值
        private static final int DEFAULT_WIDTH = 210;// 默认宽度.图片的总宽
        private static final int DEFAULT_HEIGHT = 92;// 默认高度.图片的总高
    
        private static final int DEFAULT_POINT_NUMBER = 20;
        private final int DEFAULT_COLOR = 0xff;// 默认背景颜色值
    
        // 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 point_number = DEFAULT_POINT_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();
    
            Paint paint = new Paint();
    
            for (int i = 0; i < code.length(); i++) {
                paint.setTextSize(font_size);
                randomTextStyle(paint);
                randomPadding();
                c.drawText(code.charAt(i) + "", padding_left, padding_top, paint);// 以(padding_left,padding_top)为原点,使用画笔绘制文本code.charAt(i)
                                                                                    // //
                                                                                    // +
                                                                                    // ""
            }
            int redColor = context.getResources().getColor(
                    R.color.login_promt_text_red); // 设置线条的颜色为红色
            for (int i = 0; i < line_number; i++) {
                drawLine(c, paint, redColor);
            }
    
            for (int i = 0; i < point_number; i++) {
                drawPoint(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 drawPoint(Canvas canvas, Paint paint) {
    
            int color = context.getResources().getColor(R.color.login_text_gray); // 设置字体的颜色为红色
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            paint.setStrokeWidth(3);
            paint.setColor(color);
            canvas.drawPoint(x, y, paint);
        }
    
        private void drawLine(Canvas canvas, Paint paint, int color) {
            // int color = randomColor();
    
            int startX = random.nextInt(width);
            int startY = random.nextInt(height);
            int stopX = random.nextInt(width);
            int stopY = random.nextInt(height);
    //        int startX = (Math.abs(random.nextInt(width)))%(width+1)+width;
    //        int startY = (Math.abs(random.nextInt(height)))%(height+1)+height;
    //        int startX = 0;
    //        int startY = random.nextInt(height);
    //        int stopX = (Math.abs(random.nextInt(width)))%(width+1)+width;
    //        int stopY = (Math.abs(random.nextInt(height)))%(height+1)+height;
            paint.setStrokeWidth(3);
            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();
            int color = context.getResources().getColor(
                    R.color.login_promt_text_red); // 设置字体的颜色为红色
            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);
        }
    }

    2、MainActivity.java的代码如下所示

    package com.app.code;
    
    
    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(LoginImageViewCode.getInstance(MainActivity.this).getBitmap());
            vc_code=(EditText) findViewById(R.id.vc_code);
            
            getCode=LoginImageViewCode.getInstance(MainActivity.this).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(LoginImageViewCode.getInstance(MainActivity.this).getBitmap());
                    getCode=LoginImageViewCode.getInstance(MainActivity.this).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();
                }
                
                }
            });
            
        }
    
        @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;
        }
    
    }

    3、activity_main.xml的代码如下所示

    <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"
        tools:context=".MainActivity" >
    
        <LinearLayout
            android:id="@+id/yh"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="用户名:" />
    
            <EditText
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/pwd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/yh"
            android:orientation="horizontal" >
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="密码:" />
    
            <EditText
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/code"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/pwd"
            android:layout_marginTop="4dp"
            android:gravity="center_vertical"
            android:orientation="horizontal" >
    
            <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="600dp"
                android:layout_height="600dp"
                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:layout_gravity="center_vertical"
                android:layout_marginBottom="10dp"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:layout_marginTop="5dp"
                android:background="@android:color/transparent"
                android:text="刷新验证码"
                android:textColor="#7f7f7f"
                android:textSize="12sp"
                android:textStyle="italic" />
        </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>
    
    </RelativeLayout>

    4、color.xml的代码如下所示

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <color name="login_promt_text_red">#eb271c</color>
        <color name="login_text_gray">#a8a8a8</color>
    
    </resources>
  • 相关阅读:
    codevs 1115 开心的金明
    POJ 1125 Stockbroker Grapevine
    POJ 2421 constructing roads
    codevs 1390 回文平方数 USACO
    codevs 1131 统计单词数 2011年NOIP全国联赛普及组
    codevs 1313 质因数分解
    洛谷 绕钉子的长绳子
    洛谷 P1276 校门外的树(增强版)
    codevs 2627 村村通
    codevs 1191 数轴染色
  • 原文地址:https://www.cnblogs.com/fuyanan/p/4422410.html
Copyright © 2011-2022 走看看