滑块拼图验证码应该算是很常见的功能了,验证码是可以区分用户是人还是机器。可以防止破解密码、刷票等恶意行为。本文将介绍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() {@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {//设置滑块移动距离mDY.setUnitMoveDistance(mDY.getAverageDistance(seekBar.getMax()) * i);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic 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;@Overrideprotected 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() {@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {//设置滑块移动距离mDY.setUnitMoveDistance(mDY.getAverageDistance(seekBar.getMax()) * i);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//验证是否拼接成功mDY.testPuzzle();}});//控件监听mDY.setPuzzleListener(new ImageAuthenticationView.onPuzzleListener() {@Overridepublic void onSuccess() {//mSeekBar.setEnabled(false);//禁止滑动Toast.makeText(MainActivity.this, "验证成功", Toast.LENGTH_SHORT).show();}@Overridepublic void onFail() {Toast.makeText(MainActivity.this, "验证失败", Toast.LENGTH_SHORT).show();mSeekBar.setProgress(0);}});//重置btn.setOnClickListener(new View.OnClickListener() {@Overridepublic 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.ImageAuthenticationViewandroid: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" /><SeekBarandroid:id="@+id/sb_dy"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/bg_seekbar"android:max="100" /><Buttonandroid:id="@+id/btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="重置"/>
</LinearLayout>

到这里就结束啦,需要完整源码的童鞋公众号【龙旋】回复:“滑块拼图”即可获取哦!


小编整理了一份Android电子书籍,需要的童鞋关注公众号【龙旋】回复:“e_books” 即可获取哦!

欢迎关注公众号【龙旋】,获得更多福利、精彩内容哦!

Android实现滑块拼图验证码功能相关推荐

  1. 拼图java监听器,Android 简单的实现滑块拼图验证码功能

    实现滑块拼图验证码功能之前已经写过一篇了,上一篇使用的是自定义控件的方式实现这个功能,主要还是想让童鞋们知其然更知其所以然,还没看的童鞋可以先看看Android实现滑块拼图验证码功能这篇. 在项目的开 ...

  2. c语言拼图验证码编写,Android 简单的实现滑块拼图验证码功能

    实现滑块拼图验证码功能之前已经写过一篇了,上一篇使用的是自定义控件的方式实现这个功能,主要还是想让童鞋们知其然更知其所以然,还没看的童鞋可以先看看Android实现滑块拼图验证码功能这篇. 在项目的开 ...

  3. android滑动图形验证码,Android使用更简单的方式实现滑块拼图验证码功能

    实现滑块拼图验证码功能之前已经写过一篇了,上一篇使用的是自定义控件的方式实现这个功能,主要还是想让童鞋们知其然更知其所以然,还没看的童鞋可以先看看Android实现滑块拼图验证码功能这篇. 在项目的开 ...

  4. Android滑块拼图验证码控件

    转自  王小冉的文章:https://blog.csdn.net/w690333243/article/details/90311187 https://github.com/luozhanming/ ...

  5. 滑动拼图验证码 免费 java_js+canvas实现滑动拼图验证码功能

    上图为网易云盾的滑动拼图验证码,其应该有一个专门的图片库,裁剪的位置是固定的.我的想法是,随机生成图片,随机生成位置,再用canvas裁剪出滑块和背景图.下面介绍具体步骤. 首先随便找一张图片渲染到c ...

  6. JAVA 完整实现滑块拼图验证码

    后端随机生成抠图和带有抠图阴影的背景图片,后台保存随机抠图位置坐标 前端实现滑动交互,将抠图拼在抠图阴影之上,获取到用户滑动距离值,比如以下示例 前端将用户滑动距离值传入后端,后端校验误差是否在容许范 ...

  7. JAVA 模板抠图生成滑块拼图验证码原理及实现

    实现效果图: 滑块验证码原理 很多网站使用滑块验证码提高网站安全性,为了做到真正的验证,必须要走后台服务器. 下面是java实现滑块验证的核心步骤: 1.从服务器随机取一张底透明有形状的模板图,再随机 ...

  8. Python实战 | 滑块拼图验证码高级版详解

    目录 1.如何实现滑块拼图验证码高级版? 2.HTML代码: 3.Python代码: 4.执行后报错,解决方案: 5.完整代码,修改后如下: 1.如何实现滑块拼图验证码高级版? 2.HTML代码: & ...

  9. Java Vue uni-app 三端实现,滑动拼图验证码

    一步一步实现 图片滑动验证码 项目中要使用 图片滑动验证码,顾了解之 需要以下几步来完成: 1.后端随机计算抠图的距离,生成背景与拼图块的图片,缓存 拼图块需 滑动的距离像素. 2.前端加载背景图 和 ...

  10. 【愚公系列】2022年12月 .NET CORE工具案例-滑块验证码和拼图验证功能实现

    文章目录 前言 1.滑块验证码的定义 2.滑块验证码的安全性分析 3.滑块验证码的第三方服务 一.滑动验证码和拼图验证功能实现 1.逻辑分析 2.新建项目 3.配置缓存 4.配置跨域 5.后端源码 6 ...

最新文章

  1. python基础知识整理 第七节:单例设计模式、异常、模块、包、制作模块、文件
  2. 业界首个机密计算容器运行时—Inclavare Containers正式进入CNCF!
  3. linux分析字节序的分类及特点,计算机中的字节序详解 分类: 【Linux/Windows操作系统】 2015-01-07 21:54 97人阅读 评论(0) 收藏...
  4. Android开发三 如何安装 Android SDK 和Eclipse 插件
  5. tps 交易量_交易处理系统(TPS)
  6. php 获取header_php 输出404状态码
  7. 封装scrollView 循环滚动,tableViewCell(连载) mvc
  8. TCP层的分段和IP层的分片之间的关系 MTU和MSS之间的关系
  9. 互评Alpha版本—SkyHunter
  10. 英语语法总结--动词的时态
  11. 让Fiddler调试localhost和127.0.0.1
  12. git操作是出现Username for 'https://github.com':的验证问题
  13. Docker 安装MySql后创库、创表
  14. 深度学习WideDeep模型——记忆能力和泛化能力的综合
  15. 求余数(c++基础)
  16. Yolov5—实现目标检测(win10)
  17. CentOS 7.5 搭建以太坊私联(联盟链)及区块链浏览器
  18. 机械学习篇——数据预处理
  19. Metasploit简单应用
  20. lrtimelapse中文教程_LRTimelapse中文教程

热门文章

  1. 联合概率分布、边缘概率分布
  2. 联通 吉比特无源光纤接入用户端设备(GPON ONU)TEWA-800G超级管理员 如何密码获取
  3. 图灵工业机器人说明书_图说人工智能:机器人极简史
  4. 微信小程序扫一扫获取二维码的值
  5. 基于单片机的无线病房呼叫系统设计
  6. 创新数据基础设施打通“数据”瓶颈,成就智慧院区建设
  7. Android颜色选择器
  8. linux命令行 teamview,linux centos 命令行 安装 teamviewer 启动 停止
  9. 详解哈夫曼树和哈夫曼编码
  10. python(三):时间窗口