Android自定义滑动验证条

简介: *注:不知道为什么,h5的标签在这里没用了,所以我也只能用Markdown的语法来写了项目地址:https://github.com/994866755/handsomeYe.seekbar.github.io需求:在我们的某些应用中需要滑动验证。

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

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

需求:

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

img_b9049ee784575f588a0336adf994156c.png
image.png

刚开始我也很懵逼要怎么去弄,结果我去看了一些人的代码,有人是用自定义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();
                }
            }
        });

最后实现的效果是这样:

img_7cd93b1d0b8d3dc0e9cbabb8d4d86687.png
image.png

你可以自己加文字在中间,这个我就不在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改成你滑块的宽度就行。

目录
相关文章
|
2月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
31 1
|
3月前
|
Android开发 开发者
安卓应用开发中的自定义视图
【9月更文挑战第37天】在安卓开发的海洋中,自定义视图犹如一座座小岛,等待着勇敢的探索者去发现其独特之处。本文将带领你踏上这段旅程,从浅滩走向深海,逐步揭开自定义视图的神秘面纱。
45 3
|
5月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
100 2
基于Android P,自定义Android开机动画的方法
|
3月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
115 0
|
5月前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
5月前
|
测试技术 Android开发 Python
探索软件测试的艺术:从基础到高级安卓应用开发中的自定义视图
【8月更文挑战第29天】在软件开发的世界中,测试是不可或缺的一环。它如同艺术一般,需要精细的技巧和深厚的知识。本文旨在通过浅显易懂的语言,引领读者从软件测试的基础出发,逐步深入到更复杂的测试策略和工具的使用,最终达到能够独立进行高效测试的水平。我们将一起探索如何通过不同的测试方法来确保软件的质量和性能,就像艺术家通过不同的色彩和笔触来完成一幅画作一样。
|
2月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
2月前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
44 5
|
3月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
4月前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
73 10