overview.png

之前在网上看到了当Slider控件在滑动时会弹出气泡指示器,觉得很有趣,于是就进行拓展,就有了下面介绍的一个安卓控件:IndicatorSeekBar。先附上IndicatorSeekBar项目地址: GitHub: https://github.com/warkiz/IndicatorSeekBar

image.png

对于IndicatorSeekBar,虽然做不了和上面网站的一模一样,但是基本功能还是具备的。先上笔者实现的效果图:

indicator_normal.gif

indicator_custom.gif

SeekBar实现的功能有哪些:

可以自定义尺寸和颜色

可以隐藏刻度

SeekBar选择圆角/方角

滑块下显示进度

自定义刻度下的文字

自定义滑块的图片

自定义刻度的图片

自定义气泡指示器

支持进度监听

......

实现思路: 笔者将Slider分为2大部分:上半部分的指示器和下半部分的SeekBar主体 , 如图 :

image.png

Part1:SeekBar主体:细分为5个小部分:

背景条 track_background_bar

进度条 track_progress_bar

滑块 thumb

刻度 tick

刻度的文字 text

Part2: 指示器:弹出PopouWindow。

实现 : 当点击seekbar时, 弹出PopouWindow ; 当滑动seekbar时, 不断更新

PopouWindow 的位置, 达到指示器移动的效果;当点击结束时,将指示器的PopouWindow dismiss掉。

5.主要代码

5.1. 主体

5.1.1 背景条:使用绘制线条的方式绘制。

//绘制主体背景

mStockPaint.setStrokeWidth(p.mBackgroundTrackSize);

mStockPaint.setColor(p.mBackgroundTrackColor);

canvas.drawLine(thumbX, mTrackY, mSeekEnd, mTrackY, mStockPaint);

5.1.2 进度条:绘制同背景条。

//绘制主体进度

mStockPaint.setStrokeWidth(p.mProgressTrackSize);

canvas.drawLine(mSeekStart, mTrackY, thumbX, mTrackY, mStockPaint);

5.1.3 滑块:绘制圆。

//绘制滑块

canvas.drawCircle(thumbX + p.mBackgroundTrackSize / 2.0f, mTrackY, mIsTouching ? mThumbRadius : (2 * mThumbRadius / 3f), mStockPaint);

5.1.4 刻度:绘制圆或者长方形。

//绘制刻度

canvas.drawCircle(locationX, mTrackY, mTickRadius, mStockPaint);

or

canvas.drawRect(locationX - IndicatorUtils.dp2px(mContext, 1), mTrackY - rectTickHeightRange / 2.0f, locationX + IndicatorUtils.dp2px(mContext, 1), mTrackY + rectTickHeightRange / 2.0f + .5f, mStockPaint);

5.1.5 刻度文字:绘制文本。

//绘制刻度文字

canvas.drawText(text, mTextLocationList.get(i), mPaddingTop + mThumbRadius * 2 + mRect.height() + IndicatorUtils.dp2px(mContext, 3), mTextPaint);

5.2.指示器:创建PopouWindow

5.2.1 创建

mIndicator = new PopupWindow(mIndicatorView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, false);

5.2.2 弹出

//监听SeekbBar的onTouch方法 ;当开始点击滑动时,弹出PopouWindow;

mIndicator.showAsDropDown(mSeekBar, (int) (touchX - mIndicator.getContentView().getMeasuredWidth() / 2f), -(mSeekBar.getMeasuredHeight() + mIndicator.getContentView().getMeasuredHeight() + mSeekBar.getPaddingTop() + IndicatorUtils.dp2px(mContext, 2)));

5.2.3 更新位置

//监听seekbar的onTouch方法 ;当滑动时,根据滑动的坐标更新PopouWindow的弹出位置;

mIndicator.update(mSeekBar, (int) (touchX - mIndicator.getContentView().getMeasuredWidth() / 2), -(mSeekBar.getMeasuredHeight() + mIndicator.getContentView().getMeasuredHeight() + mSeekBar.getPaddingTop() + IndicatorUtils.dp2px(mContext, 2)), -1, -1);

5.2.4 消失

//监听SeekBar的onTouch方法 ;当触摸取消时,dismiss PopouWindow;

mIndicator.dismiss();

上面的代码都不难,复杂的是内部的相互位置,不断加减计算出相关的坐标位置是指示器正确显示的关键:通过获得屏幕的宽度减去两边的padding来获得seekbar的宽度,再通过块数绘制获得一块block的长度,然后绘制刻度和刻度文字,根据触摸的坐标计算PopouWindow的位置,当进度改变时,更新其位置。

文字不能对一些细节进行详细的描述,如果对此项目感兴趣,欢迎review代码交流。

IndicatorSeekBar的实现思路已经介绍完了,如果想了解其使用场景与方式,请关注下一篇文章。

感谢

android点击弹出滑动条,IndicatorSeekBar Android自定义SeekBar,滑动时弹出气泡指示器显示进度...相关推荐

  1. echarts的滑动条 dataZoom 样式自定义

    官方链接说明:官方链接 编写实现例子: dataZoom = [{height: 15, //高度type: "slider",// show: true,xAxisIndex: ...

  2. Android按钮滚动条,Android自定义Seekbar滑动条,Pop提示跟随滑动按钮一起滑动

    由于项目需要做出此效果,自定义写了一个. 效果图 思路: 原始的seekbar只有滑动条并没有下方的提示文字,所以我们必须要继承Seekbar重写这个控件. 代码: 在values文件夹下新建attr ...

  3. Android 淘宝滑动条,淘宝菜单滑动条;

    淘宝菜单滑动条,图如下: 实现一下这个效果 , 上面是列表,可以用RecyclerView实现 , 下面跟随菜单滑动的条可以用View做位移动画实现: <LinearLayout xmlns:a ...

  4. android点击通知跳转到服务,Android 接收推送消息跳转到指定页面的方法

    问题的提出 本次接入的是个推,其他家的推送没有研究过,思路应该是类似的 App在前台,这个时候需要弹出一个对话框,提醒用户有新的消息,是否要查看,查看的话跳转到指定页面 App在后台,或是App进程已 ...

  5. [Unity]滑动条与图片填充与滑动条填充(滑动条和Image的关联)

    本人使用unity版本:2020.3.17 文章涉及UI资源为unity资源商店免费资源:Beautiful Progress Bar Free | 2D 图标 | Unity Asset Store ...

  6. android 点击接口回调,带你了解Android接口回调机制

    Android接口回调机制 接口回调是在Android中运用广泛的一种机制,你一定会眼熟它,接下来,我们从两个方面来了解接口回调 Android源码 自行动手实际运用 1.从setOnclickLis ...

  7. UISlider 滑动条-滑块大小、不能滑动、不能拖动

    2019独角兽企业重金招聘Python工程师标准>>> //滑动条UISlider* slider = [[UISlider alloc] initWithFrame:CGRectM ...

  8. android点击下拉历史记录,如何在Android上删除浏览历史记录-万兴恢复专家

    第4部分:如何在Android上永久清除历史记录? 只需删除数据或使用恢复出厂设置无法永久擦除Android.在恢复过程的帮助下,数据很容易恢复,Avast已经证明了这一点.dr.fone工具包 - ...

  9. wincc 关闭弹出窗口C语言,退出WINCC操作画面时弹出对话框要求输入用户名和密码-工业支持中心-西门子中国...

    1.最简单的就是给退出按钮设定一个权限号,比如99,该权限号需在用户管理器中预先设置好,并将该权限分配给特定的用户. 此方法无需编程,点击按钮时如用户无99号权限,则弹出无权操作对话框.当然因为简单所 ...

最新文章

  1. 慢慢学Linux驱动开发,第七篇,scull的使用
  2. shell中join链接多个域_Linux Shell中使用awk完成两个文件的关联Join
  3. java模拟Digest.认证
  4. ofstream与ate的故事
  5. Codeforces 803E--Roma and Poker (DP)
  6. Java垃圾收集器:G1GC何时将CMS强制退出?
  7. android学习笔记---36_Activity生命周期
  8. Weblogic负载均衡/Session复制之集群架构续
  9. numpy与matplotlib的学习报告
  10. 中文文档列表 - Oracle Database (文档 ID 1533057.1)
  11. 如何使用工资短信生成器
  12. Winmail + Foxmail搭建企业内部邮件系统
  13. 家庭mesh组网方案
  14. 复旦提出M2TR:首个多模态多尺度Transformer
  15. 《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(4)-- Controller Architecture
  16. kubectl的安装和配置
  17. python 领英爬虫
  18. [memo] dlopen 与 --export-dynamic
  19. 读《遥远的救世主》与观看电视剧天道
  20. 迈动互联中标中建集团

热门文章

  1. python获取当前线程名称_python使用标准库根据进程名如何获取进程的pid详解
  2. ner 评估指标_序列标注算法评估模块 seqeval 的使用
  3. 多线程c语言,如何用C语言实现多线程
  4. python中的pass语句_Python中pass的作用与使用代码示例
  5. 基于MIG控制器的DDR3读写控制详解
  6. mysql 视图 字符集_MySQL创建子视图并查看的时候,字符集报错问题
  7. 计算机原理存储器实验报告,计算机组成原理存储器实验报告.doc
  8. listview里怎么加按钮_一张照片出现好多分身,这怎么做的?
  9. 文件服务器 工作站 通信媒体,【2013年自考“网络操作系统”复习资料(22)】- 环球网校...
  10. vue radio双向绑定_Vue是如何实现双向数据绑定的