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

相关自定义样式,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=""
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 + || progress < newProgress - ) {
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 < ){
lastProgress = ;
newProgress = ;
paramSeekBar.setProgress();
return;
}
if("findme".equals(functionType) && newProgress >){
lastProgress = ;
newProgress = ;
paramSeekBar.setProgress();
return;
}
if("stop".equals(functionType) && newProgress > && newProgress <){
lastProgress = ;
newProgress = ;
paramSeekBar.setProgress();
return;
}
if (newProgress < ) {
lastProgress = ;
newProgress = ;
paramSeekBar.setProgress();
functionType = "proximitytag";
} else if (newProgress > ) {
// 设置lastProgress 要放在setProgress之前,否则可能导致执行多次onProgressChanged 改变了原值
lastProgress = ;
newProgress = ;
paramSeekBar.setProgress();
functionType = "findme"; } else {
lastProgress = ;
newProgress = ;
paramSeekBar.setProgress();
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 == ) {
proximitytag.setBackgroundResource(R.drawable.proximityblue);
} else if (last_progress == ) {
stop.setBackgroundResource(R.drawable.stopblue);
} else {
findme.setBackgroundResource(R.drawable.findblue);
}
}

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

  1. android高德地图网络路径实现自定义marker并点击弹出自定义窗口

    android中使用地图的地方随处可见,今天记录一下网络路径生成自定义marker,点击标记弹出自定义的窗口(在这里使用的是高德地图) 在这里我们使用Grilde去加载网络图片,因为这个简直太方便了! ...

  2. Android Studio 3.0 下载 使用新功能介绍

    谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...

  3. Android RatingBar 自定义样式

    Android RatingBar 自定义样式 1.先定义Style: <style name="RadingStyle" parent="@android:sty ...

  4. Android实现自定义带文字和图片的Button

    Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就 ...

  5. Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3364728.html 我前两天写过一篇博客<Android使用Fragment来 ...

  6. Android 如何自定义EditText 下划线?

    项目要求: 笔者曾经做过一个项目,其中登录界面的交互令人印象深刻.交互设计师给出了一个非常作的设计,要求做出包含根据情况可变色的下划线,左侧有可变图标,右侧有可变删除标志的输入框,如图 记录制作过程: ...

  7. Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展

    本文由“猫爸iYao”原创分享,感谢作者. 1.引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样:   ▲ 微信群聊界面里的@人功能    ▲ QQ群聊界面里 ...

  8. Android SpannableString实现TextView的点击事件

    最近项目中遇到一个问题,就是一段文字中股票可点击并跳到股票详情,只记得SpannableString可以实现富文本功能,但并不知道可实现的富文本有点击功能,就开始借助万能搜索引擎,结果不出意料,的确有 ...

  9. jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法

    本文实例讲述了jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法.分享给大家供大家参考.具体实现方法如下: 这里主要通过val方法设置按钮的文字,并用attr方法修改disabled属性实 ...

随机推荐

  1. clock_gettime的使用,计时比clock()精确

    函数"clock_gettime"是基于Linux C语言的时间函数,可以用于计算时间,有秒和纳秒两种精度. 函数原型: int clock_gettime(clockid_t c ...

  2. try catch异常捕获

    格式为: try            {                int i = int.Parse(Console.ReadLine());           //容易发生错误的语句    ...

  3. 【转】图解SQL的各种连接join

    原帖地址:http://www.nowamagic.net/librarys/veda/detail/936 图解SQL的各种连接join 让你对SQL的连接一目了然 在 2011年12月22日 那天 ...

  4. Pulltorefresh使用中碰到的问题

    第一 在使用XScrollView布局是,无法在该布局.xml文件,放置内容布局控件,假如放置了会报错, <com.markmao.pulltorefresh.widget.XScrollVie ...

  5. iOS 简单理解类的本质

    1.类也是个对象 类是一个对象是Class类型的对象简称类对象 Class类型的定义 // 一个任意的类型,表示一个Objective-C类 typedef struct objc_class *Cl ...

  6. 关于php的认识和介绍

    php的介绍: 什么是php? <1>:php是一个编程语言 <2>:php是处理php编程语言的一个软件.php语言必须运行在php软件上. 为什么要学习php? php可以 ...

  7. Linux---vi编辑器必会操作

    移动光标: (1)基本的上下左右:通过箭头按键控制 (2)跳到一行的末尾:键盘"end" (3)跳到一行的开头:键盘"home" (4)跳到最后一行:shift ...

  8. MEF学习笔记

    之前公司里用到了一个叫MEF的东西,说来惭愧一直只管写代码却不曾理解MEF框架为何物,今天就来学习一下,这是一篇迟到了不知多久的博客. -------------------------------- ...

  9. PHP学习笔记(1) - 开发环境搭建

    运行环境:phpstudy 它基本包括运行php应用需要的一切,php. apache.mysql,一键傻瓜安装 装好之后只需要配置虚拟主机和修改host文件就可以支持多站点 下载: http://w ...

  10. linux正则表达式之-基础正则表达式(基于grep)

    linux正则表达式: 简单的说,正则表达式就是为处理大量的字符串而定义的一套规则和方法,如:假设@代表123456,!代表abcde.通过定义的这些特殊符号的铺助,系统管理员就可以快速的过滤,替换或 ...