热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android自定义View实现拖动滑块完成验证

本文较长,阅读大约十分钟此效果源自于星球的星友的提问:周末忙里偷闲把效果实现了一下,其实这个效果一般都是在Web上的验证,手

本文较长,阅读大约十分钟

此效果源自于星球的星友的提问:

640?wx_fmt=png      

周末忙里偷闲把效果实现了一下,其实这个效果一般都是在Web上的验证,手机App多半还是短信验证码等方式,或者WebView加载的JS中的效果,不过要自定义View一下,这里我以我的思路来写一个自定义View,不过重在思路哈,不想写开源,很多的细节也就没注意,首先我们分析一下这个验证码的组成部分

1.背景图

2.空缺图

3.移动图

4.成功提示

5.滑块进度条

那么我们首先创建一个View叫做PictureV,先来绘制背景吧;

640?wx_fmt=jpeg      

这里我先加载了一张图片作为mBitmap,然后创建了控件宽高大小一致的bgBitmap,让mBitmap填充在bgBitmap上,这是因为我们并不确认一张图片的大小到底是多少,所以通过createBitmap创建与View等宽高的画布,最后将bgBitmap绘制在View上,显示的结果如下:

640?wx_fmt=png      

然后,我们开始绘制空缺的图片,这里我随便找了一个小方块来进行绘制,看代码:

640?wx_fmt=jpeg      

绘制空的方块只需要加载一张图片绘制出来就好了,这里我通过获得nullBitmap的宽度来作为小方块的高宽,因为我的实现是正方形的,其次计算了他默认出现的地方,也就是LINE_W,LINE_H,当然,你也可以动态随机,这个也是同理,运行一下:

640?wx_fmt=png      

可以看到方块了,那么我们现在还得绘制一块移动的方块并且截取空白方块的位置,代码如下:

640?wx_fmt=jpeg      

由于移动的方块是需要截取空白处的,所以我们还是利用了createBitmap创建一个新的位图,他的高宽就是我们的空白块高宽,并且他的大小是我们之前绘制空白块的宽度,也就是CARD_SIZE,这里要注意的是我们绘制位图的时候x轴,也就是平行线需要使用一个变量来表示,等一下滑动的时候要动态修改的,来看下效果:

640?wx_fmt=png      

这个效果看起来还是不错的,我们现在需要其实可以处理滑动事件了,因为我们这个案例是支持手势滑动的,来看下Touch的代码:

640?wx_fmt=jpeg      

这个方法中不仅处理了滑动事件,也处理了计时的任务,我们在按下的时候开始计时,当抬起的时候则关闭计时,这个时候就知道你移动一次所需要的时间,方便我们绘制结果提示,接着来看move方法吧,首先我们的拖动不能超过屏幕左右侧,所以我们左侧直接大于0,右侧的话则需要屏幕宽度减去方块大小,才赋值给moveX,然后刷新一下View就可以看到效果了,我们来看下Gif图片:

640?wx_fmt=gif      

当然,MOVE处理移动,那么UP就要处理结果了,我需要知道你到底成功了没有,那么我们可以看到,在UP中,我们首先先remove掉计时器,不管你成功与否,这一次的计时算是结束了,然后我们判断你的移动块是否在空白块的位置,也就是LINE_W和LINE_H,这里我设置了一个errorValue 误差值,防止一些手残党对不准,当位置吻合,说明移动成功了,那我们通过接口通知外部调用对象,并且这里有一个变量isSucceed设置为true再刷新,是为了onDraw里的绘制成功提示:

640?wx_fmt=png      

moveTime就是我们计算的时间了,来看下drawSucceedText这个方法:

640?wx_fmt=jpeg      

这里绘制了两部分,一个是背景一个是文字,背景直接RectF,至于他的位置,我们是放在底部,所以mHeight减去我们希望的高度即可,然后文本就比较麻烦了,因为我们要绘制居中,通过测量得出baseY,文本绘制居中这个可以参考资料或者网上一些人的讲解

640?wx_fmt=png      

这样就可以实现绘制的文本居中了,然后我们运行看下效果

640?wx_fmt=png      

到这里看起来效果还是不错的,不过我们还有一个滑动进度条要实现,本来正常来讲,直接绘制得了,直接绘制一个进度,一个滑块,根据滑动来实现拖动进度,不过这里我直接偷懒吧,使用进度条来实现,嘎嘎~~

那要怎么做呢?首先新增一个SeekBar

640?wx_fmt=jpeg      

然后PictureV新增一个接口,对外输出值,输出两个值,一个是最大值,一个是当前进度

640?wx_fmt=png      

而我们默认的当前值是moveX,而最大值则是宽度减去方块大小,接着需要新增一个对外调用的方法updateX

640?wx_fmt=png      

这个方法是提供给外部调用的,和我们的滑动事件是一样的,处理好moveX的赋值以及对成功与否的判断即可,来看下MainActivity中的调用:

640?wx_fmt=jpeg      

来看下运行效果:

640?wx_fmt=png      

这里的时间其实是没有计算到的因为没有在ACTION_DOWN中开始计时,不过本来就是偷懒的,这个小细节也懒得管了,最后放上PictureV的全部代码:

640?wx_fmt=jpeg      

最后运行一个Gif:

640?wx_fmt=gif      

大体的实现思路是如此,也并没有进行封装处理,只是想告诉同学们一种实现方式,当然,要想做到图片上的那个效果,还需要进行细化,可以根据这个View自己去魔改一下即可,思路 > Demo

Demo下载地址:

https://pan.baidu.com/s/19sDesmsGyZJfsj0Xm3U96g

提取码:w0iw

有兴趣的可以加入我的知识星球哦,只要点击阅读原文即可哦~

关于知识星球的介绍可以在公众号点击右下角的【和我学习】或者公众号发送【Hi Android】【知识星球】都可以



推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  •  项目地址https:github.comffmydreamWiCar界面做的很难看,美工方面实在不在行。重点是按钮触摸事件的处理,这里搬了RepeatListener项目代码,例 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了10分钟了解Android的事件分发相关的知识,希望对你有一定的参考价值。什么是事件分发?大家 ... [详细]
  • 1.webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用(1) ... [详细]
  • 2048小游戏小记
    1。游戏界面布局由textview1与textview2来显示分数,2048游戏主界面由gridlayout组成,底部添加Button重启游戏。2.创建游戏主类Gameview在构 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  • 涉及的知识点-ViewGroup的测量与布局-View的测量与布局-滑动冲突的处理-VelocityTracker滑动速率跟踪-Scroller实现弹性滑动-屏幕宽高的获取等实现步 ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
  • 震惊,正儿八经的网页居然在手机上这样显示!
    本篇文章所描述的,是网页移动端开发中的一些概念,以及一些常用标签~一、像素基本知识设备物理像素:设备上的一个像素点设备无关像素࿱ ... [详细]
  • 资源:吊炸天!74款APP完整源码!android界面中点击输入框时弹出输入法如果输入框在底部会出现输入法遮挡输入内容的问题解决办法设置activity的windowsoftinpu ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了预加载多个本地WebView相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 安卓开发入门!BAT大厂面试基础题集合,顺利通过阿里Android岗面试
    其实不是Android不行了,而是你跟不上了我的很多读者都在反馈说,现在一个岗位可以收到的简历数,是前几年的几倍。我们必须承认ÿ ... [详细]
author-avatar
Devil灬旋律
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有