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 @Override

 2      public  void onProgressChanged(SeekBar paramSeekBar,  int progress,
 3              boolean fromUser) {
 4         Log.i("onProgressChanged=","cc progress="+ progress + " lastProgress="+ lastProgress+" newProgress="+ newProgress);
 5          if(progress >newProgress+10 || progress<newProgress-10){
 6             newProgress = lastProgress;
 7             paramSeekBar.setProgress(lastProgress);
 8              return;
 9         }
10 
11         newProgress = progress;
12     }
13 
14     @Override
15      public  void onStartTrackingTouch(SeekBar paramSeekBar) {
16         Log.i("onStartTrackingTouch="," lastProgress="+ lastProgress+" newProgress="+ newProgress);
17         
18     }
19 
20     @Override
21      public  void onStopTrackingTouch(SeekBar paramSeekBar) {
22         Log.i("onStopTrackingTouch="," lastProgress="+ lastProgress+" newProgress="+ newProgress);
23         
24          if(newProgress<30){
25             lastProgress = 0;
26             newProgress =0;
27             paramSeekBar.setProgress(0);
28         } else  if(newProgress>70){
29              // 设置lastProgress 要放在setProgress之前,否则可能导致执行多次onProgressChanged 改变了原值
30              lastProgress = 100;
31             newProgress = 100;
32             paramSeekBar.setProgress(100);
33         } else{
34             lastProgress = 50;
35             newProgress =50;
36             paramSeekBar.setProgress(50);
37         }
38         Log.v("onStopTrackingTouch2="," lastProgress="+ lastProgress+" newProgress="+ newProgress);
39         changeProgressStateImg(lastProgress);
40     }

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

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

<LinearLayout

                 android:layout_width ="fill_parent"
                android:layout_height ="wrap_content"
                android:layout_marginTop ="25dip"   >

< SeekBar
                     android: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;
    }

@Override
     public  void onStartTrackingTouch(SeekBar paramSeekBar) {

}

@Override
     public  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);
        }
    }

流风,飘然的风  本人创建的Android技术交流QQ群(253065556) 需要的人可以加入
本人博客网站: http://www.ssqhm.com 
本人百度经验网址: http://jingyan.baidu.com/user/npublic?un=zdz8207

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. python程序更新实现_Python 软件热更新
  2. python 查看安装的第三方库的版本号
  3. Skywalking-12:Skywalking SPI机制
  4. 坑:找到LoadRunner中Recording Options和 Run Time Settings配置选项确实的原因
  5. solidity之call相关函数
  6. 了解计算机中的信息编码教案,《信息编码》教学设计
  7. CCF认证201712-2游戏
  8. busybox的编译和使用
  9. 巴特沃斯滤波器带通matlab,巴特沃斯数字带通滤波器.doc
  10. 如何限定apt-get使用IPv4或IPv6协议下载
  11. 攻防世界-杂项-simple_transfer
  12. Express高效查询纯真IP库插件lib-qqwry
  13. 在拥有vin码识别的时代,您还在傻乎乎手工录入吗?
  14. ERP管理系统开发设计现有源码
  15. java常见面试题(含答案)
  16. Axure如何实现全选、全不选功能
  17. 一次内存泄露排查小结
  18. AST反混淆插件|如何还原Array对象里的元素
  19. 财税SaaS行业格局再变,慧算账为何能受资本“偏爱”?
  20. eureka java_Eureka服务注册入门,服务启动

热门文章

  1. win7下U盘安装Ubuntu14.04桌面版实现双系统
  2. Web项目中诡异的java.lang.ClassNotFoundException: ch.qos.lorgback.classic.PatternLayout问题解决
  3. 使用Python多线程犯的错误总结
  4. JSP汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程网页设计
  5. 源码管理工具VSN的安装与使用--eclipse
  6. android4.3 adhoc补丁,小wifi教您如何安装安卓系统ADHOC补丁-爱毒霸交流论坛
  7. 如何用Stata完成(shui)一篇经济学论文(十三):断点回归(上)
  8. 频域波束形成matlab,SONAR_code 波束形成技术,包括相移 ,频域 matlab代码,以及相关实验的ppt 263万源代码下载- www.pudn.com...
  9. “跳槽啦”一个广告菜鸟的自白
  10. filezilla定时上传_ftp定时任务上传文件,ftp怎么做到定时任务上传文件