android三档自定义滑动开关,禁止点击功能的实现,普通开关网上有很多例子,三档滑动开关的则找了整天都没有相关例子,开始用普通开关的源码修改了自己实现了一个类,但效果不如人意,各种边界情况的算法很难考虑周全很难调试出满意的效果。

今 天尝试用系统组件seekbar实现自定义风格的滑动条,但禁止点击和判断滑动不到指定范围返回花了不少时间,网上基本上都说用继承seekbar修改里 面的方法实现,但整了半天也没有一个能够达到效果了,而且感觉太麻烦了,所以自己把默认的实现的几个接口返回的信息详细打印出来调试了下,发现可以通过返 回参数来实现自己想要的结果。

先上个效果图

核心部分代码:

private SeekBar seekbar;

private int lastProgress = 0;

private int newProgress = 0;

seekbar = (SeekBar)findViewById(R.id.seekBar);
        seekbar.setOnSeekBarChangeListener( this);
        //lastProgress=? 从配置文件中读取
        seekbar.setProgress(lastProgress);
  1

@Overridepublic void onProgressChanged(SeekBar paramSeekBar, int progress,boolean fromUser) {Log.i("onProgressChanged=","cc progress="+ progress + " lastProgress="+ lastProgress+" newProgress="+ newProgress);if(progress >newProgress+10 || progress<newProgress-10){newProgress = lastProgress;paramSeekBar.setProgress(lastProgress);return;}newProgress = progress;}@Overridepublic void onStartTrackingTouch(SeekBar paramSeekBar) {Log.i("onStartTrackingTouch="," lastProgress="+ lastProgress+" newProgress="+ newProgress);}@Overridepublic void onStopTrackingTouch(SeekBar paramSeekBar) {Log.i("onStopTrackingTouch="," lastProgress="+ lastProgress+" newProgress="+ newProgress);if(newProgress<30){lastProgress = 0;newProgress =0;paramSeekBar.setProgress(0);}else if(newProgress>70){//设置lastProgress 要放在setProgress之前,否则可能导致执行多次onProgressChanged 改变了原值lastProgress = 100;newProgress = 100;paramSeekBar.setProgress(100);}else{lastProgress = 50;newProgress =50;paramSeekBar.setProgress(50);}Log.v("onStopTrackingTouch2="," lastProgress="+ lastProgress+" newProgress="+ newProgress);changeProgressStateImg(lastProgress);}

相关自定义样式,layout里面的布局

         <LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="25dip" ><SeekBarandroid:id="@+id/seekBar"android:layout_width="520px"android:layout_height="wrap_content"android:layout_centerInParent="true"android:max="100"android:maxHeight="32px"android:minHeight="32px"android:paddingLeft="25px"android:paddingRight="25px"android:progressDrawable="@drawable/seekbar_style"android:thumb="@drawable/seekbar_thumb" /></LinearLayout>

简单解释下seekbar中几个重要的属性:

android:layout_height="wrap_content"
//建议使用wrap_content,否则一定要保证设置的值不小于seekbar图片资源中的最高值

android:paddingLeft="25px"
android:paddingRight="25px"

//说明进度条的最低和最大高度,解决高度问题。
android:paddingLeft="18px"
android:paddingRight="18px"
//解决拖动按钮在最左最右显示不全的问题,padding的值一般是thumb的一半宽度。
android:progressDrawable="@drawable/seekbar_style"
//设置了此值,就表示使用自定义的进度条样式,在其中可以设置进度条背景图,进度条图,缓冲条图。
android:thumb="@drawable/seekbar_thumb"
//seekbar的拖动按钮图片

seekbar_style.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list  xmlns:android="http://schemas.android.com/apk/res/android">  <item  android:id="@android:id/background"  android:drawable="@drawable/seekbar_bg"/>  <item  android:id="@android:id/progress"  android:drawable="@drawable/seekbar_bg"/>  <item  android:id="@android:id/secondaryProgress"  android:drawable="@drawable/seekbar_bg"/> </layer-list>  

seekbar_thumb.xml\

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">        <!-- 按下状态-->  <item    android:state_focused="true"    android:state_pressed="true"    android:drawable="@drawable/thumb_normal" />        <!-- 普通无焦点状态 -->  <item    android:state_focused="false"    android:state_pressed="false"  android:drawable="@drawable/thumb_normal" />              <!-- 有焦点状态-->  <item    android:state_focused="true"    android:state_pressed="false"              android:drawable="@drawable/thumb_normal" />         <!-- 有焦点 -->  <item    android:state_focused="true"              android:drawable="@drawable/thumb_normal" />
</selector> 

===================================

注:在实际应用中对上面代码进行了多次调优,这里把最终发布版本的代码再共享下,效果图如下:

核心代码(优化部分,和上面相同的就不再重复了):

@Override
public void onProgressChanged(SeekBar paramSeekBar, int progress,boolean fromUser) {
//        Log.i("onProgressChanged=", "cc progress=" + progress
//                + " lastProgress=" + lastProgress + " newProgress="
//                + newProgress);//+- 20 根据滑动条的宽度确定对应的比例if (progress > newProgress + 20 || progress < newProgress - 20) {newProgress = lastProgress;paramSeekBar.setProgress(lastProgress);return;}newProgress = progress;}@Overridepublic void onStartTrackingTouch(SeekBar paramSeekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar paramSeekBar) {
//        Log.i("onStopTrackingTouch=", " lastProgress=" + lastProgress
//                + " newProgress=" + newProgress+ " functionType=" + functionType);if(newProgress == lastProgress){return;}if("proximitytag".equals(functionType) && newProgress <30 ){lastProgress = 0;newProgress = 0;paramSeekBar.setProgress(0);return;}if("findme".equals(functionType) && newProgress >70){lastProgress = 100;newProgress = 100;paramSeekBar.setProgress(100);return;}if("stop".equals(functionType) && newProgress >30 && newProgress <70){lastProgress = 50;newProgress = 50;paramSeekBar.setProgress(50);return;}if (newProgress < 30) {lastProgress = 0;newProgress = 0;paramSeekBar.setProgress(0);functionType = "proximitytag";} else if (newProgress > 70) {// 设置lastProgress 要放在setProgress之前,否则可能导致执行多次onProgressChanged 改变了原值lastProgress = 100;newProgress = 100;paramSeekBar.setProgress(100);functionType = "findme";} else {lastProgress = 50;newProgress = 50;paramSeekBar.setProgress(50);functionType = "stop";}Log.v("onStopTrackingTouch2=", " lastProgress=" + lastProgress+ " newProgress=" + newProgress);changeProgressStateImg(lastProgress);}public void changeProgressStateImg(int last_progress) {ImageView proximitytag = (ImageView) MainActivity.this.findViewById(R.id.proximitytag);ImageView stop = (ImageView) MainActivity.this.findViewById(R.id.stop);ImageView findme = (ImageView) MainActivity.this.findViewById(R.id.findme);proximitytag.setBackgroundResource(R.drawable.proximityblack);stop.setBackgroundResource(R.drawable.stopblack);findme.setBackgroundResource(R.drawable.findblack);if (last_progress == 0) {proximitytag.setBackgroundResource(R.drawable.proximityblue);} else if (last_progress == 50) {stop.setBackgroundResource(R.drawable.stopblue);} else {findme.setBackgroundResource(R.drawable.findblue);}}

转载于:https://www.cnblogs.com/zhujiabin/p/4286578.html

Android 三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现相关推荐

  1. android三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现

    android三档自定义滑动开关,禁止点击功能的实现,普通开关网上有很多例子,三档滑动开关的则找了整天都没有相关例子,开始用普通开关的源码修改了自己实现了一个类,但效果不如人意,各种边界情况的算法很难 ...

  2. android如何实现微信功能吗,android 借助AccessibilityService实现模拟点击功能-微信助手(一)...

    下集预告: android 借助AccessibilityService实现模拟点击功能-几个工具类(二)发此文还是想分享一些自己在android模拟点击这块的收获和想法 为什么开发模拟点击? 这是一 ...

  3. android 借助AccessibilityService实现模拟点击功能-微信助手(一)

    demo地址 发此文还是想分享一些自己在android模拟点击这块的收获和想法 为什么开发模拟点击? 这是一个很好的问题.从我们开始开发微信相关的xposed模块的时候,就知道xposed这东西用着不 ...

  4. Android m 自定义下拉菜单,Android实现动画效果的自定义下拉菜单功能

    我们在购物APP里面设置收货地址时,都会有让我们选择省份及城市的下拉菜单项.今天我将使用Android原生的 Spinner 控件来实现一个自定义的下拉菜单功能,并配上一个透明渐变动画效果. 要实现的 ...

  5. android实现新闻内容显示功能,Android开发实现自定义新闻加载页面功能实例

    本文实例讲述了Android开发实现自定义新闻加载页面功能.分享给大家供大家参考,具体如下: 一.概述: 1.效果演示: 2.说明:在新闻页面刚加载的时候,一般会出现五种状态 未知状态(STATE_U ...

  6. android+自定义发彩信,Android实现获取短信验证码的功能以及自定义GUI短信验证

    短信验证功能大家都很熟悉了.在很多地方都能见到,注册新用户或者短息验证支付等.短信验证利用短信验证码来注册会员,大大降低了非法注册,很大程度上提高了用户账户的安全性. 目前市面上已经有了很多提供短信验 ...

  7. android-短信验证功能,Android实现获取短信验证码的功能以及自定义GUI短信验证详解...

    <Android实现获取短信验证码的功能以及自定义GUI短信验证详解>由会员分享,可在线阅读,更多相关<Android实现获取短信验证码的功能以及自定义GUI短信验证详解(8页珍藏版 ...

  8. android 手写签批_Android自定义实现手写签名功能

    一.Android自定义View步骤 : 自定义属性: 选择和设置构造方法: 重写onMeasure()方法: 重写onDraw()方法: 重写onLayout()方法: 重写其他事件的方法(滑动监听 ...

  9. android自定义手势,Android实现自定义手势和识别手势的功能

    这篇文章主要介绍了Android实现自定义手势和识别手势的功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 1. 先完成自定义手势的Activity 1.1 因 ...

最新文章

  1. NSNotification消息通知实现源码(观察者模式原理)
  2. roads 构筑极致用户体验_长安马自达「悦马星空」计划上线,为用户带来极致服务体验...
  3. [vue] 你知道vue的模板语法用的是哪个web模板引擎的吗?说说你对这模板引擎的理解
  4. CTA策略06_BollChannelStrategy
  5. java xml stax_Java StAX解析器示例以读取XML文件
  6. 安装APK时弹窗提示“Detected problems with app native libraries”
  7. 蚂蚁金服Java面试题、笔试题(含答案)-高级
  8. Typora加超链接实现页内跳转的三种方法
  9. 【BZOJ3831】[Poi2014]Little Bird 单调队列
  10. JavaScript函数式编程之函子
  11. 一个小型RISC-V开源处理器核介绍!
  12. 在web.xml中配置多个param-value
  13. $.request方法
  14. Lasso回归理论及代码实现
  15. MATLAB初入门(一)
  16. 新一代杂志新一代杂志社新一代编辑部2022年第13期目录
  17. Photoneo 3D相机丨平行结构光的力量
  18. 1102: 火车票退票费计算(函数专题)Python
  19. python hydra库
  20. java读取视频_【转载】Java 后端读取视频文件获取视频流后 前端进行播放/下载...

热门文章

  1. 删除多个连续id的数据
  2. 离散数学_第二章:基本结构:集合、函数、序列、求和和矩阵(1)
  3. Go语言-实现单链表反转算法
  4. 计算机为用户设置上网时间,电脑怎么设置控制孩子的上网时间
  5. 008-企业网站纽曼官网实现
  6. 手机装Linux开mc服务器,在Debian Linux上开启MineCraft(MC)服务器的1点经验
  7. Spark Streaming系列-5、应用案例: 百度搜索风云榜
  8. Flutter 3 发布了(文末推荐一个免费的在线Flutter学习教程)
  9. 赋能云会议渠道,开会宝 vymeet发布“梧桐计划”,培养未来的合作伙伴
  10. Failed to load Main-Class manifest attribute from