Android自定义滑动验证条的示例代码

本文介绍了Android自定义滑动验证条的示例代码,分享给大家,具体如下:

*注:不知道为什么,h5的标签在这里没用了,所以我也只能用Markdown的语法来写了

项目地址:https://github.com/994866755/handsomeYe.seekbar.github.io

需求:

在我们的某些应用中需要滑动验证。比如说这个样子的:

刚开始我也很懵逼要怎么去弄,结果我去看了一些人的代码,有人是用自定义viewgroup去做,就是viewgroup包含滑动块和滑动条。但我觉得太麻烦,直到我知道android有个控件seekbar可以实现这个效果。

一、使用SeekBar实现滑动条

  <SeekBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:max="100"
    android:maxHeight="45dp"
    android:minHeight="45dp"
    android:progress="0"
    android:clickable="false"
    android:progressDrawable="@drawable/bg_forgotpassword_seekbar"
    android:thumb="@drawable/bg_seekbar_thumb"
    android:id="@+id/sb_progress"
    android:thumbOffset="-1dp"
    android:padding="1dp"
    />

这里网上有很多介绍,我也顺便解释一下:

(1)android:max是总共的容量,这里设100就行。

(2)android:progressDrawable是只设置进度框的背景,就是整个条的背景,比如图中的没滑动的时候是灰色,滑动的地方是绿色。

(3)android:thumb这个属性是设置滑块的样式,比如图中的没滑时是>>,滑到最右变成勾。默认的样式是一个圆。

(4)android:thumbOffset这个是滑块的起始位置,怎么说呢,你可以当图中第一条的滑块是android:thumbOffset = “0dp”,如果你设置成正数,这个滑块的位置会向左移动,设成负数会向右移动。我这里设成-1是以为是0的时候会挡住左边的边框,这样不好看,我设成-1为了让滑块向右移动一点。

二、设置SeekBar样式

写好布局后来写下样式,也就是上面的progressDrawable和thumb属性。

(1)progressDrawable(滑动条)

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <!--seekBar背景-->
  <item android:id="@android:id/background">
    <!--形状-->
    <shape android:shape="rectangle">
      <!--大小-->
      <size android:height="29dp" />
      <!--圆角-->
      <corners android:radius="2dp" />
      <!--背景-->
      <solid android:color="#E7EAE9" />
      <!--边框-->
      <stroke
        android:width="1dp"
        android:color="#C3C5C4" />
    </shape>
  </item>
  <!--seekBar的进度条-->
  <item android:id="@android:id/progress">
    <clip>
      <shape>
        <corners android:radius="2dp" />
        <solid android:color="#7AC23C" />
        <stroke
          android:width="1dp"
          android:color="#C3C5C4" />
      </shape>
    </clip>
  </item>
</layer-list>

(2)thumb(滑块)

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- 按下状态-->
  <item android:drawable="@mipmap/seekbar_thumb" android:state_pressed="true" />

  <!-- 有焦点状态 -->
  <item android:drawable="@mipmap/seekbar_thumb" android:state_focused="true" />

  <!-- 普通状态 -->
  <item android:drawable="@mipmap/seekbar_thumb" />
</selector>

这里就不多介绍了。

三、加入监听

在activity中加入监听,比如你可以让滑块不滑到最右时自动弹回原位等等。

sbProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
      @Override
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

      }

      @Override
      public void onStartTrackingTouch(SeekBar seekBar) {

      }

      @Override
      public void onStopTrackingTouch(SeekBar seekBar) {
        if (seekBar.getProgress() != seekBar.getMax()) {
          seekBar.setProgress(0);
        }else {
          sbProgress.setEnabled(false);
          setData();
        }
      }
    });

最后实现的效果是这样:

你可以自己加文字在中间,这个我就不在demo里弄了。

四、剩下的处理

你以为这样就完啦?那你太天真了,你会发现如果你按上面的步骤做,最后会有一个很蛋疼的效果:

你不滑动滑块,只点击滑动条中间,滑块会马上到中间。

也就是说我们想做的效果是只滑动而不能点击,仅仅做成这样是没办法实现这个需求。

那怎么办?我在网上找了很多文章,大多都是不能滑也不能点,而我要的是能滑不能点。难道SeekBar没戏啦?我想了想,最后我用事件分发来解决。

既然是事件分发,我这里也不想写事件分发的内容,以后我们写一篇专门关于事件分发的文章,这里如果有小伙伴不了解事件分发的话,自己先去google一下。

既然是事件分发,那我们就需要自定义seekbar啦,其实很简单。我先贴代码,然后再讲解。

(1)代码君:

public class VerificationSeekBar extends SeekBar{
  //这两个值为用算法使用的2空间复杂度
  private int index = 150;
  private boolean k = true;

  public VerificationSeekBar(Context context) {
    super(context);
  }

  public VerificationSeekBar(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public VerificationSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  @Override
  public boolean dispatchTouchEvent(MotionEvent event) {
    int x = (int) event.getX();
    if (event.getAction() == MotionEvent.ACTION_DOWN){
      k = true;
      if (x - index > 20) {
        k = false;
        return true;
      }
    }
    if (event.getAction() == MotionEvent.ACTION_MOVE){
      if (!k){
        return true;
      }
    }
    return super.dispatchTouchEvent(event);
  }
}

(2)讲解

为了方便讲解,我把其它的内容删掉,就留关键方法,没错,就是dispatchTouchEvent。但是如果我不说,可能dispatchTouchEvent里面的代码你会看得蒙。

先说说我的思想:简单来说就是你点击的地方要在滑块的范围,才分发事件,不然retrun true不分发事件。所以有了x - index > 20,这里的index =150是我滑块的大概宽度,所以要你点击的地方在我滑块的宽度的20像素直接我才分发事件。所以x - index > 20的话不分发。

int x = (int) event.getX(); 获取点击时的坐标,注意,是相对于view左上角的,而不是相对屏幕的。

我这里分别按顺序判断了event.getAction() == MotionEvent.ACTION_DOWN和event.getAction() ==MotionEvent.ACTION_MOVE,注意,是按顺序。为什么要按顺序呢?首先你自己测试你会发现,点击seekbar时ACTION_DOWN和ACTION_MOVE都会执行,所以你不能光判定按下,还要判断滑动。那为什么不一起判断而要按顺序判定呢?因为一起判断的话你可以试试,你会发现根本就滑不了。

而学过事件分发的都知道事件先执行ACTION_DOWN再执行ACTION_MOVE,所以先判断点击的地方是否在滑块+20像素的范围内,如果不在,定义一个布尔值k记录不在,然后执行 if (!k){return true;}

唉!感觉这个算法讲得不是很好,听不懂没关系,你照抄就行,记得把index改成你滑块的宽度就行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 高仿斗鱼滑动验证码

    如下图.在Android上实现起来就不太容易,有些效果还是不如web端酷炫.) 我们的Demo,Ac娘镇楼 (图很渣,也忽略底下的SeekBar,这不是重点) 一些动画,效果录不出来了,大家可以去斗鱼web端看一下,然后下载Demo看一下,效果还是可以的. 代码 传送门: https://github.com/mcxtzhang/SwipeCaptcha 我们的Demo和web端基本上一样. 那么本控件包含不仅包含以下功能: 随机区域起点(左上角x,y)生成一个验证码阴影.验证码拼图 凹凸图形会

  • Android控件SeekBar仿淘宝滑动验证效果

    SeekBar是一个拖动条控件,最简单的案例就是我们的调节音量,还有音频视频的播放,传统的SeekBar样式,如图 传统的实现太简单,不足以让我们到能装逼的地步.本来是打算实现滴滴出行滑动完成订单的效果,可惜找不到效果图,今天也就用淘宝的滑动验证来作为实例 1.1 实现分析 SeekBar:使用progressDrawable属性自定义SeekBar 拖动块:使用thumb属性更改,其实就是一张图片 文字:使用RelativeLayout嵌套在一起 1.2 实现布局 <?xml version=

  • Android自定义滑动验证条的示例代码

    本文介绍了Android自定义滑动验证条的示例代码,分享给大家,具体如下: *注:不知道为什么,h5的标签在这里没用了,所以我也只能用Markdown的语法来写了 项目地址:https://github.com/994866755/handsomeYe.seekbar.github.io 需求: 在我们的某些应用中需要滑动验证.比如说这个样子的: 刚开始我也很懵逼要怎么去弄,结果我去看了一些人的代码,有人是用自定义viewgroup去做,就是viewgroup包含滑动块和滑动条.但我觉得太麻烦,

  • Android自定义滑动删除效果的实现代码

    先给大家展示下效果图,如果感觉不错,请参考实现代码: 序言 最近项目中需要用到滑动删除,然后去网上搜了一下,发现现有网上的各种解决办法各式各样,但是还是找不到一个能将所有细节和逻辑处理好的,至于滑动删除部分,我觉得处理的相对比较好的是 QQ(包括处理各种逻辑和细节);最终,苦寻无果,于是决定自己动手,丰衣足食 这篇文章将从现有 Android 滑动删除的痛点,到搭建好一个基本的框架,到最终提供一份完整的 Demo为止,争取为读者提供最大的可定制化 正文 一. 滑动删除的痛点 (1). 现有资料中

  • Android自定义View实现多边形统计图示例代码

    前言   最近利用空闲时间学习了自定义View的一些知识,为了巩固,写了一个小东西,顺便分享出来,下面话不多说了,来一起看看详细的介绍吧. 简介   一个多边形统计图.边数,每个方向的值,每个点的文字等等都是可以设置的. 下面就来分析一下这个自定义View 这个view由以下几个部分组成 M层N边形 中心到各顶点的连线 填充区域 文字 @Override protected void onDraw(Canvas canvas) { if (!canDraw()) { return; } canv

  • Android自定义双向进度条的实现代码

    想整个双向的进度条,就是可以选取播放范围的. 像这样: 然而官方控件里只有单向的.不要慌,我们自己画一个. 绘制一个进度条主要是三方面.1.样式,2.尺寸,3.操作监听. 完整代码来一遍: 注释基本上就把原理说明了一下. package util; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint;

  • Android 侧边滑动关闭Activity的示例代码

    0.效果图 1.设置Activity样式属性 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowIsTranslucent">true</item> </style> 2.自定义侧边阴影视图 class SlideBackView extends View { pr

  • vue实现滑动验证条

    本文实例为大家分享了vue实现滑动验证条的具体代码,供大家参考,具体内容如下 效果 代码 VerifySlider.vue <template>   <div     ref="dragDiv"     class="drag"   >     <div ref="drag_bg" class="drag_bg" />     <div ref="drag_text"

  • Flutter仿微信通讯录实现自定义导航条的示例代码

    某些页面比如我们在选择联系人或者某个城市的时候需要快速定位到我们需要的选项,一般都会需要像微信通讯录右边有一个导航条一样的功能,由A到Z进行快速定位,本篇文章我们将自己来实现一个跟微信通讯录同样的功能. 关键点:手势定位滑动.列表定位.手势.列表联动. 准备数据,首先我们需要准备导航目录数据, List<String> _az = [ "☆", "A", "B", "C", "D", "

  • Laravel 5.5 的自定义验证对象/类示例代码详解

    Laravel 5.5 将提供一个全新的自定义验证规则的对象,以作为原来的 Validator::extend 方法的替代. Laravel 5.5 将提供一个全新的自定义验证规则的对象,以作为原来的 Validator::extend 方法的替代..很多时候我们会直接用正则表达式来处理这种特殊的验证,也有时候我们会选择用 Validator::extend 来扩展一个自定义的规则.但在 Laravel 5.5 版本中,我们有了新的手段,只要定义一个实现 Illuminate\Contracts

  • Android 实现自定义圆形进度条的实例代码

    Android 自定义圆形进度条 今天无意中发现一个圆形进度,想想自己实现一个,如下图: 基本思路是这样的: 1.首先绘制一个实心圆 2.绘制一个白色实心的正方形,遮住实心圆 3.在圆的中心动态绘制当前进度的百分比字符 4.绘制一个与之前实心圆相同颜色的空心圆 5.逐渐改变当前的百分比 6.根据百分比,逐渐改变正方形的大小,逐渐减小正方形的底部y轴的坐标,不断重绘,直到达到100% 首先看看自定义的属性 在values目录下新建attrs.xml内容如下: 定义绘制圆形的背景色,和绘制圆形的半径

  • Android View滑动的实现分析示例

    目录 1.layout方法 2.offsetLeftAndRight()与offsetTopAndBottom() 3.LayoutParams(改变布局参数) 4.scrollTo与scrollBy 5.Scroller 实现View滑动有很多种方法,这篇帖子介绍6中滑动的方法,分别是: layout().offsetLeftAndRight().offsetTopAndBottom().LayoutParams.scrollTo.scrollBy.Scroller. 1.layout方法 绘

随机推荐