最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android本地驗證碼的生成代碼

 更新時間:2021年01月28日 14:40:30   作者:Loften_93663469  
這篇文章主要為大家詳細介紹了Android本地驗證碼的生成,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

android客戶端生成本地驗證碼主要用來限制用戶隨意按請求按鈕,其實該示例也是來對自定義view的練練手而已,先給出效果圖吧

其中可定制:

*干擾線數(shù)目
*干擾點數(shù)目
*背景顏色
*驗證碼字體大小及字數(shù)

相信以上可以滿足一般的需要了吧,不夠的話可自行添加,下面就來講實現(xiàn)的步驟了

繼承view,重寫構造方法,并初始化所需參數(shù)

public class ValidationCode extends View {

 private Paint mTextPaint;//文字畫筆
 private Paint mPointPaint;//干擾點畫筆
 private Paint mPathPaint;//干擾線畫筆
 private Paint mBitmapPaint;//Bitmap圖畫筆
 private String mCodeString;//隨機驗證碼
 private int mCodeCount;//驗證碼位數(shù)
 private float mTextSize;//驗證碼字符大小
 private int mPointNumber;//干擾點數(shù)目
 private int mLineNumber;//干擾線數(shù)目
 private int mBackGround;//背景顏色
 private float mTextWidth;//驗證碼字符串的顯示寬度
 private static int mWidth;//控件的寬度
 private static int mHeight;//控件的高度
 private static Random mRandom = new Random();
 private Bitmap bitmap = null;//生成驗證碼圖片


 public ValidationCode(Context context) {
  this(context, null);
 }

 public ValidationCode(Context context, AttributeSet attrs) {
  super(context, attrs);
  getAttrValues(context, attrs);
  init();
 }

 /**
  * 獲取布局文件中的值
  */
 private void getAttrValues(Context context, AttributeSet attrs) {
  TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ValidationCode);
  mCodeCount = typedArray.getInteger(R.styleable.ValidationCode_CodeCount, 4);
  mPointNumber = typedArray.getInteger(R.styleable.ValidationCode_PointNumber, 100);
  mLineNumber = typedArray.getInteger(R.styleable.ValidationCode_LineNumber, 2);
  mTextSize = typedArray.getDimension(R.styleable.ValidationCode_CodeTextSize, 20);
  mBackGround = typedArray.getColor(R.styleable.ValidationCode_BackGround,Color.WHITE);
  typedArray.recycle();
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));

 }

 /**
  * 初始化畫筆
  */
 private void init() {
  //生成隨機數(shù)字和字母組合
  mCodeString = getValidationCode(mCodeCount);
  //初始化文字畫筆
  mTextPaint = new Paint();
  mTextPaint.setStrokeWidth(3);
  mTextPaint.setTextSize(mTextSize);
  //初始化干擾點畫筆
  mPointPaint = new Paint();
  mPointPaint.setStrokeWidth(4);
  mPointPaint.setStrokeCap(Paint.Cap.ROUND);//設置斷點處為圓形
  //初始化干擾線畫筆
  mPathPaint = new Paint();
  mPathPaint.setStrokeWidth(5);
  mPathPaint.setColor(Color.GRAY);
  mPathPaint.setStyle(Paint.Style.STROKE);//設置畫筆為空心
  mPathPaint.setStrokeCap(Paint.Cap.ROUND);//設置斷點處為圓形
  //初始化Bitmap畫筆
  mBitmapPaint = new Paint();
  mBitmapPaint.setColor(Color.RED);
  //取得驗證碼字符串顯示的寬度值
  mTextWidth = mTextPaint.measureText(mCodeString);

 }
}

getAttrValues方法是用來配置自定義的屬性,需要在 values 中新建 * attrs.xml * 文件,并加上自定義的屬性,如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="ValidationCode">
  <attr name="CodeCount" format="integer"/>
  <attr name="PointNumber" format="integer"/>
  <attr name="LineNumber" format="integer"/>
  <attr name="CodeTextSize" format="dimension"/>
  <attr name="BackGround" format="color"/>
 </declare-styleable>
</resources>

onMeasure方法則是在你需要對自定義的view的大小做出處理時,通過setMeasuredDimension設置該控件大小,下面給出重新定義的寬高代碼塊

/**
* 對view的寬高進行重新定義
*/
private int measureWidth(int measureSpec) {
 int result = 0;
 int specMode = MeasureSpec.getMode(measureSpec);
 int specSize = MeasureSpec.getSize(measureSpec);

 if (specMode == MeasureSpec.EXACTLY) {
  result = specSize;
 } else {
  result = (int) (mTextWidth * 2.0f);
  if (specMode == MeasureSpec.AT_MOST) {
   result = Math.min(result, specSize);
  }
 }
 return result;
}

private int measureHeight(int measureSpec) {
 int result = 0;

 int specMode = MeasureSpec.getMode(measureSpec);
 int specSize = MeasureSpec.getSize(measureSpec);

 if (specMode == MeasureSpec.EXACTLY) {
  result = specSize;
 } else {
  result = (int) (mTextWidth / 1.5f);
  if (specMode == MeasureSpec.AT_MOST) {
   result = Math.min(result, specSize);
  }
 }
 return result;
}

重寫onDraw(),繪制圖形

1、繪制驗證碼文本字符串,干擾點,干擾線,生成驗證碼的bitmap圖

/**
 * 獲取驗證碼
 *
 * @param length 生成隨機數(shù)的長度
 * @return
 */
public static String getValidationCode(int length) {
 String val = "";
 Random random = new Random();
 for (int i = 0; i < length; i++) {
  //字母或數(shù)字
  String code = random.nextInt(2) % 2 == 0 ? "char" : "num";
  //字符串
  if ("char".equalsIgnoreCase(code)) {
   //大寫或小寫字母
   int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
   val += (char) (choice + random.nextInt(26));
  } else if ("num".equalsIgnoreCase(code)) {
   val += String.valueOf(random.nextInt(10));
  }
 }
 return val;
}

/**
 * 生成干擾點
 */
private static void drawPoint(Canvas canvas, Paint paint) {
 PointF pointF = new PointF(mRandom.nextInt(mWidth) + 10, mRandom.nextInt(mHeight) + 10);
 canvas.drawPoint(pointF.x, pointF.y, paint);
}

/**
 * 生成干擾線
 */
private static void drawLine(Canvas canvas, Paint paint) {
 int startX = mRandom.nextInt(mWidth);
 int startY = mRandom.nextInt(mHeight);
 int endX = mRandom.nextInt(mWidth);
 int endY = mRandom.nextInt(mHeight);
 canvas.drawLine(startX, startY, endX, endY, paint);
}

/**
 1. 繪制驗證碼并返回
 */
private Bitmap generateValidate(){
 if(bitmap != null && !bitmap.isRecycled()){
  //回收并且置為null
  bitmap.recycle();
  bitmap = null;
 }
 //創(chuàng)建圖片和畫布
 Bitmap sourceBitmap = Bitmap.createBitmap(mWidth,mHeight, Bitmap.Config.ARGB_8888);
 Canvas canvas = new Canvas(sourceBitmap);

 //畫背景顏色
 canvas.drawColor(mBackGround);

 //畫上驗證碼
 int length = mCodeString.length();
 float charLength = mTextWidth / length;
 for (int i = 1; i <= length; i++) {
  int offsetDegree = mRandom.nextInt(15);
  //這里只會產(chǎn)生0和1,如果是1那么正旋轉正角度,否則旋轉負角度
  offsetDegree = mRandom.nextInt(2) == 1 ? offsetDegree : -offsetDegree;
  canvas.save();
  canvas.rotate(offsetDegree, mWidth / 2, mHeight / 2);
  //給畫筆設置隨機顏色
  mTextPaint.setARGB(255, mRandom.nextInt(200) + 20, mRandom.nextInt(200) + 20,
    mRandom.nextInt(200) + 20);
  canvas.drawText(String.valueOf(mCodeString.charAt(i - 1)), (i - 1) * charLength * 1.6f + 30,
    mHeight * 2 / 3f, mTextPaint);
  canvas.restore();
 }

 //產(chǎn)生干擾效果1 -- 干擾點
 for (int i = 0; i < mPointNumber; i++) {
  mPointPaint.setARGB(255, mRandom.nextInt(200) + 20, mRandom.nextInt(200) + 20,
    mRandom.nextInt(200) + 20);
  drawPoint(canvas, mPointPaint);
 }

 //生成干擾效果2 -- 干擾線
 for (int i = 0; i < mLineNumber; i++) {
  mPathPaint.setARGB(255, mRandom.nextInt(200) + 20, mRandom.nextInt(200) + 20,
    mRandom.nextInt(200) + 20);
  drawLine(canvas, mPathPaint);
 }

 canvas.save();
 return sourceBitmap;
}

2、實現(xiàn)onDraw()方法,繪畫出驗證碼

@Override
protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);

 //獲取控件的寬和高
 mHeight = getHeight();
 mWidth = getWidth();

 if(bitmap == null){
  bitmap = generateValidate();
 }
 canvas.drawBitmap(bitmap,0,0,mBitmapPaint);
}

添加觸摸事件,點擊切換驗證碼

@Override
public boolean onTouchEvent(MotionEvent event) {
 switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
   mCodeString = getValidationCode(mCodeCount);
   bitmap = generateValidate();
   invalidate();
   break;
  default:
   break;
 }
 return super.onTouchEvent(event);
}

添加公開使用方法

我們總是需要提供給用戶調(diào)用的方法,判斷驗證碼是否一致之類的,方便用戶進一步的操作,這里提供個幾個方法

/**
 * 判斷驗證碼是否一致
 *
 * @String CodeString
 * 這里忽略大小寫
 */
public Boolean isEqualsIgnoreCase(String CodeString) {
 return mCodeString.equalsIgnoreCase(CodeString);
}

/**
 * 判斷驗證碼是否一致
 * 不忽略大小寫
 */
public Boolean isEquals(String CodeString) {
 return mCodeString.equals(CodeString);
}

/**
 * 外界控件調(diào)用刷新驗證碼圖片
 */
public void refresh(){
 mCodeString = getValidationCode(mCodeCount);
 bitmap = generateValidate();
 invalidate();
}

以上就是生成本地驗證碼的一個簡單的自定義view步驟,這里就給出源碼地址,有需要的就去看看。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android 組合控件實現(xiàn)布局的復用的方法

    Android 組合控件實現(xiàn)布局的復用的方法

    本篇文章主要介紹了Android 組合控件實現(xiàn)布局的復用的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Android 傳感器--光照傳感器詳解及使用

    Android 傳感器--光照傳感器詳解及使用

    本文主要介紹 Android傳感器 光照傳感器的使用,這里整理了相關資料及示例代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • Android利用Paint自定義View實現(xiàn)進度條控件方法示例

    Android利用Paint自定義View實現(xiàn)進度條控件方法示例

    這篇文章主要給大家介紹了關于Android利用Paint自定義View實現(xiàn)進度條控件的相關資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-11-11
  • Android so庫的熱更新問題

    Android so庫的熱更新問題

    這篇文章主要介紹了Android so庫的熱更新問題的相關資料,需要的朋友可以參考下
    2017-11-11
  • TextView長按復制的實現(xiàn)方法(總結)

    TextView長按復制的實現(xiàn)方法(總結)

    下面小編就為大家?guī)硪黄猅extView長按復制的實現(xiàn)方法(總結)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Kotlin定義其他類的實現(xiàn)詳解

    Kotlin定義其他類的實現(xiàn)詳解

    這篇文章主要介紹了Kotlin定義其他類的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09
  • Android通訊錄開發(fā)之刪除功能的實現(xiàn)方法

    Android通訊錄開發(fā)之刪除功能的實現(xiàn)方法

    這篇文章主要介紹了Android通訊錄開發(fā)之刪除功能的實現(xiàn)方法,有需要的朋友可以參考一下
    2014-01-01
  • Android應用中實現(xiàn)跳轉外部瀏覽器打開鏈接功能

    Android應用中實現(xiàn)跳轉外部瀏覽器打開鏈接功能

    在開發(fā)Android應用程序時,有時候我們需要讓用戶跳轉到外部瀏覽器打開特定的鏈接,例如打開一個網(wǎng)頁、下載文件等,本文將介紹如何在Android應用中實現(xiàn)跳轉外部瀏覽器打開鏈接的功能,感興趣的朋友一起看看吧
    2024-06-06
  • Android Studio3安裝圖文教程

    Android Studio3安裝圖文教程

    這篇文章主要為大家詳細介紹了Android Studio3安裝圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Android Studio手動打包的教程圖解

    Android Studio手動打包的教程圖解

    項目寫完了,現(xiàn)在需要把應用上傳到市場上面,那么怎么把項目打包成apk呢?下面腳本之家小編給大家?guī)砹薃ndroid Studio手動打包的方法,一起看看吧
    2018-07-07

最新評論

潮安县| 灵丘县| 永年县| 句容市| 曲阳县| 辽阳县| 临邑县| 阿坝| 隆回县| 迁安市| 灌南县| 营山县| 和政县| 邳州市| 抚州市| 马尔康县| 清远市| 灵山县| 湟中县| 图片| 海淀区| 肥乡县| 鄂托克前旗| 德保县| 保靖县| 杭州市| 萨嘎县| 同德县| 万山特区| 西昌市| 广河县| 天门市| 五河县| 剑河县| 兴隆县| 安阳市| 清远市| 玉树县| 和静县| 五寨县| 昔阳县|