Android实现滑块拼图验证码功能

滑块拼图验证码应该算是很常见的功能了,验证码是可以区分用户是人还是机器。可以防止破解密码、刷票等恶意行为。本文将介绍Android拼图滑块验证码控件的实现过程。希望能帮助到大家。

先看最终的效果图:

本文只是做了个Demo,并没有加入到实际的项目中,所以各位童鞋可以根据自己的需求就行修改即可。

一、实现步骤:

1、定义自定义属性; 2、确认目标位置,这里使用的是阴影图片来遮盖背景图片; 3、创建与目标位置相结合的滑块图片; 4、设置目标阴影图片和滑块图片可以随机旋转,并保持一致; 5、创建拖拽条,使滑块随着拖拽条的拖拽而移动; 6、判断是否验证成功。

二、实现流程:

1、定义自定义属性 创建一个attr文件来定义一些自定义属性

   <declare-styleable name="ImageAuthenticationView">
    <!--滑块的高度-->
    <attr name="unitHeight" format="dimension" />
    <!--滑块的宽度-->
    <attr name="unitWidth" format="dimension" />
    <!--滑块占图片高度的比例-->
    <attr name="unitHeightScale" format="integer" />
    <!--滑块占图片宽度的比例-->
    <attr name="unitWidthScale" format="integer" />
    <!--滑块边框的图片资源-->
    <attr name="unitShadeSrc" format="reference" />
    <!--阴影部分的图片资源-->
    <attr name="unitShowSrc" format="reference" />
    <!--是否需要旋转-->
    <attr name="needRotate" format="boolean" />
    <!--验证时的误差值-->
    <attr name="deviate" format="integer" />
  </declare-styleable>

2、确认目标位置,这里使用的是阴影图片来遮盖背景图片

 /**
   * 创建目标图片(阴影部分)
   */
  private Bitmap drawTargetBitmap() {
    // 绘制图片
    Bitmap showB;
    if (null != mShowBp) {
      showB = handleBitmap(mShowBp, mUintWidth, mUintHeight);
    } else {
      showB = handleBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.puzzle_show), mUintWidth, mUintHeight);
    }
    // 如果需要旋转图片,进行旋转,旋转后为了保持和滑块大小一致,需要重新缩放比例
    if (needRotate) {
      showB = handleBitmap(rotateBitmap(rotate, showB), mUintWidth, mUintHeight);
    }
    return showB;
  }

3、创建与目标位置相结合的滑块图片

 /**
   * 创建结滑块图片
   *
   * @param bp
   */
  private Bitmap drawResultBitmap(Bitmap bp) {
    // 绘制图片
    Bitmap shadeB;
    if (null != mShadeBp) {
      shadeB = handleBitmap(mShadeBp, mUintWidth, mUintHeight);
    } else {
      shadeB = handleBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.puzzle_shade), mUintWidth, mUintHeight);
    }
    // 如果需要旋转图片,进行旋转,旋转后为了和画布大小保持一致,避免出现图像显示不全,需要重新缩放比例
    if (needRotate) {
      shadeB = handleBitmap(rotateBitmap(rotate, shadeB), mUintWidth, mUintHeight);
    }
    Bitmap resultBmp = Bitmap.createBitmap(mUintWidth, mUintHeight,
        Bitmap.Config.ARGB_8888);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    Canvas canvas = new Canvas(resultBmp);
    canvas.drawBitmap(shadeB, new Rect(0, 0, mUintWidth, mUintHeight),
        new Rect(0, 0, mUintWidth, mUintHeight), paint);
    // 选择交集去上层图片
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
    canvas.drawBitmap(bp, new Rect(0, 0, mUintWidth, mUintHeight),
        new Rect(0, 0, mUintWidth, mUintHeight), paint);
    return resultBmp;
  }

4、设置目标阴影图片和滑块图片可以随机旋转,并保持一致

 /**
   * 旋转图片
   *
   * @param degree
   * @param bitmap
   * @return
   */
  public Bitmap rotateBitmap(int degree, Bitmap bitmap) {
    Matrix matrix = new Matrix();
    matrix.postRotate(degree);
    Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
        bitmap.getHeight(), matrix, true);
    return bm;
  }

5、创建拖拽条,使滑块随着拖拽条的拖拽而移动

  //滑块监听
    mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
      @Override
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
        //设置滑块移动距离
        mDY.setUnitMoveDistance(mDY.getAverageDistance(seekBar.getMax()) * i);
      }

      @Override
      public void onStartTrackingTouch(SeekBar seekBar) {

      }

      @Override
      public void onStopTrackingTouch(SeekBar seekBar) {
        //验证是否拼接成功
        mDY.testPuzzle();
      }
    });

6、判断是否验证成功

/**
   * 验证是否拼接成功
   */
  public void testPuzzle() {
    if (Math.abs(mUnitMoveDistance - mUnitRandomX) <= DEFAULT_DEVIATE) {
      if (null != mlistener) {
        mlistener.onSuccess();
      }
    } else {
      if (null != mlistener) {
        mlistener.onFail();
      }
    }
  }

三、完整代码

1、自定义控件内容太多这里就不放出来了,完整Demo源码会放在文章后面;

2、代码逻辑

public class MainActivity extends Activity {

  //滑块
  private SeekBar mSeekBar;
  //自定义的控件
  private ImageAuthenticationView mDY;
  private Button btn;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    initListener();
  }

  private void initView() {
    mDY = findViewById(R.id.dy_v);
    mSeekBar = findViewById(R.id.sb_dy);
    btn = findViewById(R.id.btn);
  }

  private void initListener() {
    //滑块监听
    mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
      @Override
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
        //设置滑块移动距离
        mDY.setUnitMoveDistance(mDY.getAverageDistance(seekBar.getMax()) * i);
      }

      @Override
      public void onStartTrackingTouch(SeekBar seekBar) {

      }

      @Override
      public void onStopTrackingTouch(SeekBar seekBar) {
        //验证是否拼接成功
        mDY.testPuzzle();
      }
    });

    //控件监听
    mDY.setPuzzleListener(new ImageAuthenticationView.onPuzzleListener() {
      @Override
      public void onSuccess() {
        //mSeekBar.setEnabled(false);//禁止滑动
        Toast.makeText(MainActivity.this, "验证成功", Toast.LENGTH_SHORT).show();
      }

      @Override
      public void onFail() {
        Toast.makeText(MainActivity.this, "验证失败", Toast.LENGTH_SHORT).show();
        mSeekBar.setProgress(0);
      }
    });

    //重置
    btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        //mSeekBar.setEnabled(true);
        mSeekBar.setProgress(0);
        mDY.reSet();
      }
    });
  }
}

3、布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:dy="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center"
  android:orientation="vertical"
  android:paddingLeft="10dp"
  android:paddingTop="10dp"
  android:paddingRight="10dp"
  android:paddingBottom="10dp"
  tools:context=".MainActivity">

  <com.sjl.keeplive.slideImg.ImageAuthenticationView
    android:id="@+id/dy_v"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scaleType="centerCrop"
    android:layout_marginBottom="10dp"
    android:src="@mipmap/test"
    dy:needRotate="true"
    dy:unitHeight="60dp"
    dy:unitShadeSrc="@mipmap/puzzle_shade"
    dy:unitShowSrc="@mipmap/puzzle_show"
    dy:unitWidth="80dp" />

  <SeekBar
    android:id="@+id/sb_dy"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_seekbar"
    android:max="100" />

  <Button
    android:id="@+id/btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="重置"/>
</LinearLayout>

源码下载

到此这篇关于Android实现滑块拼图验证码功能的文章就介绍到这了,更多相关Android 滑块拼图验证码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • android实现图片验证码方法解析(自绘控件)

    自绘控件的内容都是自己绘制出来的 大致流程如下: 1.定义一个类继承view 1.使用TypedArray初始化属性集合     在view的构造方法中 有一个AttributeSet的参数 很明显是用来保存控件属性信息的 我们也的确可以通过循环然后用键值对的方式获取信息 而TypedArray是用来简化我们的工作的 2.重写onMeasure 测量控件大小 3.重写onDraw 绘制控件 2.根据需求在attrs文件中自定义属性 declare-styleable 声明自定义属性可以自定义一个

  • Android开发中通过手机号+短信验证码登录的实例代码

    首先,需要一个电话号码,目前很多账户都是将账户名设置成手机号,然后点击按钮获取手机验证码. 其次,你需要后台给你手机短信的验证接口,各个公司用的不一样,这个身为前端,不需要你来考虑,你只要让你后台给你写好接口,你直接调用就好了. activity_login.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

  • Android实现短信验证码获取自动填写功能(详细版)

    现在的应用在注册登录或者修改密码中都用到了短信验证码,那在android中是如何实现获取短信验证码并自动填写的呢? 首先,需要要在manifest中注册接收和读取短信的权限: <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> <uses-permission android:name="android.permission.READ_

  • Android实现短信验证码自动拦截读取功能

    知识准备:  1.观察者模式的理解[文章稍后来到~~]  2.Android的Cursor使用[Android基础]  3.正则表达式使用[Java基础]  4.Handler使用[Android基础] 代码整理: MainActivity.java import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.suppo

  • Android实现短信验证码自动填写功能

    本实例为大家分享了Android实现短信验证码自动填写功能,供大家参考,具体内容如下 实现思路很简单: 1.在需要输入验证码的Activity代码注册监听短信的广播 2.拦截短信,获取其中的验证码 3.回写到EditText private SmsReciver smsReciver = new SmsReciver(); /** 收到短信Action **/ String ACTION_SMS_RECIVER = "android.provider.Telephony.SMS_RECEIVED

  • Android开发工程中集成mob短信验证码功能的方法

    一.前言 现在的app基本上都需要用到短信功能,注册时或者有消息通知时需要给用户发送一条短信,但是对于个人开发者来说,去买第三方的短信服务实在是有点奢侈,很好的是mob为我们提供了免费的短信验证码服务功能,我不是打广告,的确觉得这项服务很不错.那么下面就简单讲一下如何在自己的工程里集成mob的短信功能,其实整个流程并不复杂,只是个人觉得mob的官方文档有点小乱,官方Demo也有点小复杂,同时有一些细节地方容易被忽视,也会导致一些问题. PS:太喜欢mob的logo了. 二.实现过程 本篇只涉及A

  • Android获取短信验证码的实现方法

    先给大家展示下效果图,如果感觉不错,请参考实现思路详解 Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发出找回密码请求时的短信验证,他们的工作原理大致上是一致的,因为项目的需要研究了一下关于这方面的知识,本篇我将带领大家一起实现这一当下流行的设计方案. 众所周知,短信验证需要服务器端生成一个验证码,然后发送到用户输入的手机上,这个过程需要服务器主

  • Android实现获取短信验证码并自动填写功能

    本文实例为大家分享了Android短信验证码获取并自动填写功能的具体代码,供大家参考,具体内容如下 代码如下: MainActivity public class MainActivity extends AppCompatActivity { public static TextView mText; private SmsContent content; @Override protected void onCreate(Bundle savedInstanceState) { super.

  • Android实现滑块拼图验证码功能

    滑块拼图验证码应该算是很常见的功能了,验证码是可以区分用户是人还是机器.可以防止破解密码.刷票等恶意行为.本文将介绍Android拼图滑块验证码控件的实现过程.希望能帮助到大家. 先看最终的效果图: 本文只是做了个Demo,并没有加入到实际的项目中,所以各位童鞋可以根据自己的需求就行修改即可. 一.实现步骤: 1.定义自定义属性: 2.确认目标位置,这里使用的是阴影图片来遮盖背景图片: 3.创建与目标位置相结合的滑块图片: 4.设置目标阴影图片和滑块图片可以随机旋转,并保持一致: 5.创建拖拽条

  • Android 简单的实现滑块拼图验证码功能

    实现滑块拼图验证码功能之前已经写过一篇了,上一篇使用的是自定义控件的方式实现这个功能,主要还是想让童鞋们知其然更知其所以然,还没看的童鞋可以先看看Android实现滑块拼图验证码功能这篇. 在项目的开发过程中,时间比较紧急,通过自定义的方式很显然需要耗费很多时间去写,所以我们需要使用更简单的方式实现,这样会帮我们节省很多时间去解决其它的问题,使用依赖库的方式显然是最节省时间的,下面我们来看看是怎么实现的吧! 本篇主要从两方面进行介绍: 1.使用依赖库实现最终的功能: 2.依赖库的介绍: 实现过程

  • Vue实现滑动拼图验证码功能

    缘由:之前看哔哩哔哩官网登录的时候有一个拼图验证码,很好奇怎么去实现.然后就想着自己弄一个.先给大家看我的最终效果.后面再一点点拆解代码. 为什么想着写这个功能呢,主要在于拼图验证码在前端这里会比较复杂并且深入.相比文字拼写,12306的图片验证码都没有拼图验证码对前端的要求来的复杂,和难. 我总结下知识点: 1.弹窗功能 2.弹窗基于元素定位 3.元素拖动 4.canvas绘图 5.基础逻辑 一.弹窗和弹窗组件 抱歉,这里我偷懒了直接用了elementUI的el-popover组件,所以小伙伴

  • js+canvas实现滑动拼图验证码功能

    上图为网易云盾的滑动拼图验证码,其应该有一个专门的图片库,裁剪的位置是固定的.我的想法是,随机生成图片,随机生成位置,再用canvas裁剪出滑块和背景图.下面介绍具体步骤. 首先随便找一张图片渲染到canvas上,这里#canvas作为画布,#block作为裁剪出来的小滑块. <canvas width="310" height="155" id="canvas"></canvas> <canvas width=&q

  • python3 使用OpenCV计算滑块拼图验证码缺口位置(场景示例)

    前言 滑块拼图验证码的失败难度在于每次图片上缺口位置不一样,需识别图片上拼图的缺口位置,使用python的OpenCV库来识别到 环境准备 pip 安装 opencv-python pip installl opencv-python OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了很多处理图片.视频的方法. OpenCV库提供了一个方法(matchTemplate()):从一张较大的图片中搜索一张较小图片,计算出这张大图上各

  • Node.JS用纯JavaScript生成图片或滑块式验证码功能

    有一些Node.JS图片生成类库,比如node-captcha等的类库,需要c/c++程序生成图片.跨平台部署不是很方便.这里介绍几个用纯JS实现的图片验证码生成模块. captchapng 用纯JavaScript实现的验证码生成模块. https://github.com/GeorgeChan/captchapng 安装简单,依赖少: npm install captchapng 示例: var captchapng = require('captchapng'); app.get('/si

  • Java实现滑块拼图验证码

    本文实例为大家分享了Java实现滑块拼图验证码的具体代码,供大家参考,具体内容如下 1.后端随机生成抠图和带有抠图阴影的背景图片,后台保存随机抠图位置坐标 2.前端实现滑动交互,将抠图拼在抠图阴影之上,获取到用户滑动距离值,比如以下示例 3.前端将用户滑动距离值传入后端,后端校验误差是否在容许范围内. 这里单纯校验用户滑动距离是最基本的校验,出于更高的安全考虑,可能还会考虑用户滑动的整个轨迹,用户在当前页面的访问行为等.这些可以很复杂,甚至借助到用户行为数据分析模型,最终的目标都是增加非法的模拟

  • Python实现滑块拼图验证码详解

    目录 初级版滑块拼图验证码 补充知识点 高级版滑动拼图验证码 滑动拼图验证码可以算是滑块验证码的进阶版本,其验证机制相对复杂.本节将介绍两种滑动拼图验证码:初级版和高级版本. 初级版滑块拼图验证码 初级版滑动拼图验证码是在普通滑块验证码的基础上增加了随机的滑动距离,用户需要根据拼图的缺口位置来决定滑块的滑动位置. 如下左图所示为一个滑块拼图验证码的起始状态,注意此时还没有显示拼图和缺口.单击滑块后就会出现拼图和缺口,如下右图所示.之后会利用这一特性来找到拼图和缺口的位置. 下面开始编写代码.首先

  • JavaScript实现拖动滑块拼图验证功能(html5、canvas)

    引言: 滑块拖动验证现在很多地方都用到,周末就琢磨着写了一个,放上来,看看有没有人用得上! 效果: 实现思路: 用一张画布绘制源图,再绘制一个填充的方形,这样就可以达到缺失的效果(方形的坐标是随机的): 再用一个画布绘制拖动块,同时用drawImage截取和上一步中方形区域一样坐标.大小的原图,就作为验证图了,把验证图放在最左边: 在拖动块处,按下鼠标然后拖动,拖动块和验证图会跟随鼠标移动,达到一定范围后放开鼠标,会进行验证: 验证通过则提示验证成功,验证不通过则拖动块和验证图会返回到最左边.

  • vue+elementui实现拖住滑块拼图验证

    vue拖住滑块拼图验证,以下是cavas直接写的滑块拼图验证码,直接复制引用即可 <template>   <div id="puzzle" ref="puzzle" style="display:inline-block;">   <!-- :style="'padding:' + 16*scale + 'px ' + 16*scale + 'px ' + 28*scale + 'px;border-ra

随机推荐