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. 转载--- SQL Server XML基础学习之<4>--XPath

    T-SQL 支持用于查询  XML 数据类型的 XQuery 语言. XQuery 基于现有的 XPath 查询语言,并支持更好的迭代.更好的排序结果以及构造必需的  XML 的功能. 所以我们本章先 ...

  2. ASP.NET验证控件详解

    现在ASP.NET,你不但可以轻松的实现对用户输入的验证,而且,还可以选择验证在服务器端进行还是在客户端进行,再也不必考虑那么多了,程序员们可以将重要精力放在主程序的设计上了. ASP.NET公有六种 ...

  3. ubuntu系统安装jdk

    1,首先到jdk官网下载jdk. 2,然后再把下载下来的jdk包(jdk-8u20-linux-i586.tar.gz),然后打开shell,进入超级管理员权限,进入刚才下载的目录(cd 目录名),然 ...

  4. python输出1到100之和的几种方法

    1. 使用内建函数range print sum(range(1,101)) 2. 使用函数reduce print reduce(lambda a,b:a+b,range(1,101)) 3. 使用 ...

  5. ### 线性回归(Regression)

    linear regression logistic regression softmax regression #@author: gr #@date: 2014-01-21 #@email: fo ...

  6. ###学习《C++ Primer》- 3

    点击查看Evernote原文. #@author: gr #@date: 2014-10-04 #@email: forgerui@gmail.com Part 3: STL泛型算法(第10章) 一. ...

  7. C#定义自定义类型转换

    类型转换不限于单一继承链中的类型(派生类转换为基类或者基类转换为派生类),完全不相关的类型之间也能进行转换.关键在于在两个类型之间提供转型操作符. 在下面这样的情况下应该定义显式转型操作符: 在转型有 ...

  8. IO流01_File类

    [分类] Java的IO通过java.io包下的类和接口来支持. 1.按照流向: 输入流     输出流 2.按照操作数据的大小: 字节流( 8位字节 )     字符流( 16位字节 ) 3.按照角 ...

  9. JS 版的pnp in_array($str,$arr)

    var a = Array(1,2,3,4,5); function in_array(search,array){ for(var i in array){ if(array[i]==search) ...

  10. SQL 字符替换

    --匹配所有字符替换 )),'被替换','替换') --匹配给定位子替换 update 表名 set 列=stuff(列名,从一开始数位数,往后数几位,替换)