[Android实例] 拖动滑块进行图片拼合验证方式的实现
该篇文章从eoeAndroid搬迁过来的,原文地址:[Android实例] 拖动滑块进行图片拼合验证方式的实现
现在网站上有各种各样的验证码验证方式,比如计算大小,输入图片内容等,今天在一家网站上看到这样的一种效果,感觉眼前一亮,验证方式是给出一张缺失一点的图片,然后在旁边有缺失部分的滑块,需要将该滑块拖动到图片缺失的地方补全才能验证成功,看到这种方式,我就想如何在android上去实现这种滑动验证的效果。
我的思路是,自定义控件,重写onDraw方法
1.根据原图和控件的大小裁剪出对应比例的背景图片,然后在控件中绘制出该背景图片
// 根据原图进行裁剪出适合当前屏幕的背景图
if (bgBitmap == null) {
if (bitmap == null) {
return;
}
bgBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
Canvas bgCanvas = new Canvas(bgBitmap);
Rect bgRect;
if (bitmap.getWidth() / getWidth() < bitmap.getHeight() / getHeight()) {
bgRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getWidth() * bitmap.getHeight() / getWidth());
} else {
bgRect = new Rect(0, 0, bitmap.getWidth() * bitmap.getHeight() / getHeight(), bitmap.getHeight());
}
bgCanvas.drawBitmap(bitmap, bgRect, new Rect(0, 0, getWidth(), getHeight()), paint);
bitmap.recycle();
bitmap = null;
}
// 绘制背景图
canvas.drawBitmap(bgBitmap, null, new Rect(0, 0, getWidth(), getHeight()), paint);
2.计算背景图片缺失部分的左上角的位置,以及缺失部分图片所在初始位置的起点,绘制缺失部分的位置并裁剪缺失部分的图片
// 计算验证的点和拖动起点
if (verifyPoint == null) {
int width = getWidth();
int height = getHeight();
int randomY = (int) (Math.random() * height);
int verifyX = width * 3 / 4 - 10;
int verifyY = randomY + height / 4 + 10 > height ? height * 3 / 4 - 10 : randomY;
verifyPoint = new Point(verifyX, verifyY);
startPoint = new Point(10, verifyY);
}
paint.setColor(Color.GRAY);
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
// 绘制验证的位置
Rect verifyRect = new Rect(verifyPoint.x, verifyPoint.y, verifyPoint.x + getWidth() / 4,
verifyPoint.y + getHeight() / 4);
canvas.drawRect(verifyRect, paint);
// 裁剪拖动的图片
if (verifyBitmap == null) {
verifyBitmap = Bitmap.createBitmap(getWidth() / 4, getHeight() / 4, Config.ARGB_8888);
Canvas verifyCanvas = new Canvas(verifyBitmap);
verifyCanvas.drawBitmap(bgBitmap, verifyRect,
new Rect(0, 0, verifyBitmap.getWidth(), verifyBitmap.getHeight()), paint);
}
3.绘制裁剪的缺失部分图片
// 拖动图片的绘制
if (isMoving) {// 拖动中
canvas.drawRect(new Rect(movePoint.x - 2, movePoint.y - 2, movePoint.x + getWidth() / 4 + 2,
movePoint.y + getHeight() / 4 + 2), paint);
canvas.drawBitmap(verifyBitmap, null,
new Rect(movePoint.x, movePoint.y, movePoint.x + getWidth() / 4, movePoint.y + getHeight() / 4),
paint);
} else {
canvas.drawRect(new Rect(startPoint.x - 2, startPoint.y - 2, startPoint.x + getWidth() / 4 + 2,
startPoint.y + getHeight() / 4 + 2), paint);
canvas.drawBitmap(verifyBitmap, null,
new Rect(startPoint.x, startPoint.y, startPoint.x + getWidth() / 4, startPoint.y + getHeight() / 4),
paint);
}
4.重写onTouchEvent方法
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (event.getX() > startPoint.x && event.getX() < startPoint.x + getWidth() / 4
&& event.getY() > startPoint.y && event.getY() < startPoint.y + getHeight() / 4) {
movePoint = new Point(startPoint);
moveX = (int) event.getX();
isMoving = true;
invalidate();
return true;
}
break;
case MotionEvent.ACTION_MOVE:
if (isMoving) {
if (movePoint.x + getWidth() / 4 < getWidth() && movePoint.x > 0) {
invalidate();
}
movePoint = new Point((int) (movePoint.x + event.getX() - moveX), movePoint.y);
moveX = (int) event.getX();
return true;
}
break;
case MotionEvent.ACTION_UP:
if (isMoving) {
if (onVerifyListener != null) {
if (Math.abs(movePoint.x - verifyPoint.x) < 10) {
onVerifyListener.success();
} else {
onVerifyListener.fail();
}
}
isMoving = false;
movePoint = null;
moveX = 0;
invalidate();
return true;
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
下载地址:项目代码
[Android实例] 拖动滑块进行图片拼合验证方式的实现的更多相关文章
- Android实例-TRectangle加载图片(XE8+小米2)
结果: 1.加载图片很流畅,可以做背景用. 2.现在是加载了正形与圆形,其他形状能不能加载呢?自己测试哦,要多动手才行. 3.需要把图片打到包里哦(路径为“assets\internal\”). 实例 ...
- Android 实例解说加入本地图片和调用系统拍照图片
在项目的开发过程我们离不开图片.而有时候须要调用本地的图片,有时候须要调用拍照图片.同一时候实现拍照的方法有两种,一种是调用系统拍照功能.还有一种是自己定义拍照功能. 而本博文眼下仅仅解说第一种方法, ...
- js 拖动滑块验证
备注:拖动滑块时尽量平移,chrome浏览器上没有卡顿情况,但是搜狗极速模式和360极速模式都遇到了卡顿,拖不动情况,应是浏览器内部对事件响应速度导致吧. JS代码: ;(function ($,wi ...
- Android拖动和缩放图片
Android拖动和缩放图片 2014年5月9日 我们在使用应用其中常常须要浏览图片.比方在微信其中.点击图片之后能够对图片进行缩放. 本博客介绍怎样对图片进行拖拽和缩放.这首先要了解Android中 ...
- jQuery手机触屏拖动滑块验证跳转插件
HTML: <!DOCTYPE html> <html lang="en"> <head> <title>jQuery手机触屏拖动滑 ...
- [Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现
[Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现 今天做Android项目的时候要用到图片选择,要实现拍照获取图片和从相册获取图片,并且要求在获取完之后可以裁剪,试了很多方法之 ...
- [Android实例] app引导页(背景图片切换加各个页面动画效果)(申明:来源于网络)
[Android实例] app引导页(背景图片切换加各个页面动画效果)(申明:来源于网络) 地址: http://www.eoeandroid.com/thread-918356-1-1.html h ...
- 原生js实现拖动滑块验证
拖动滑块验证是现在的网站随处可见的,各式各样的拖动法都有. 下面实现的是某宝的拖动滑块验证: <!DOCTYPE html> <html lang="en"> ...
- android实例3:拖动条
个人网站http://www.ravedonut.com/ 拖动条改变图片的透明度 xml <LinearLayout xmlns:android="http://schemas.an ...
随机推荐
- Vulkan --vulkan in powervr
zhankeng 跨平台 多线程 low cpu overhead object orientated vulkan有利于tile based的地方 明确依赖声明 细粒度同步 render passe ...
- 十个WEB开发人员不可不知的HTML5工具
Initializr 这是一个HTML5模板创建工具,帮助你得到持续的最新的HTML5样板文件. XRAY XRAY目前支持Safari, Firefox和IE浏览器,XRAY使用了CSS3的多个酷炫 ...
- UVA 12487 Midnight Cowboy(LCA+大YY)(好题)
题目pdf:http://acm.bnu.edu.cn/v3/external/124/12487.pdf 大致题意: 一棵树,一个人从A节点出发,等可能的选不论什么一条边走,有两个节点B,C求这个人 ...
- 【架构】SpringCloud 注册中心、负载均衡、熔断器、调用监控、API网关示例
示例代码: https://github.com/junneyang/springcloud-demo 参考资料: SpringCloud系列 Eureka 一句话概括下spring框架及spring ...
- nodejs自动热加载文件的做法
https://stackoverflow.com/questions/1972242/how-to-auto-reload-files-in-node-js -------------------- ...
- python时间格式化及前推
import datetime >>> (datetime.datetime.now() - datetime.timedelta(seconds = 300)).strftime( ...
- Android Studio 3.0 下载 使用新功能介绍
谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...
- 上传的文件放在SVN服务器的哪个目录下
SVN服务器版本库有两种格式,一种为FSFS,一种为BDB 把文件上传到SVN版本库后,上传的文件不再以文件原来的格式存储,而是被svn以它自定义的格式压缩成版本库数据,存放在版本库中. 如果是FSF ...
- 上传app store 应用指南链接--2
http://www.docin.com/p-166876874.html http://jamesli.cn/blog/?p=955 http://www.adobe.com/devnet/flas ...
- GIS+=地理信息+容器技术(4)——Docker执行
-------------------------------------------------------------------------------------- Blog: http ...