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. items 与iteritems

    dict的items函数返回的是键值对的元组的列表,而iteritems使用的是键值对的generator. items当使用时会调用整个列表 iteritems当使用时只会调用值. >> ...

  2. (转)Quartz.NET管理类

    最近做项目设计到Quartz.NET,写了一个Quartz.NET管理类,在此记录下. public class QuartzManager<T> where T : class,IJob ...

  3. HttpClient Post Get请求方法,留在以后可能会用到

    /// <summary> /// Post请求返回实体 /// </summary> /// <param name="url">请求地址&l ...

  4. ASCII Table/ASCII表

    ASCII Table/ASCII表 参考: 1.Table of ASCII Characters

  5. HDOJ1005 数列

    Problem Description A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) ...

  6. Linux用户级线程和内核级线程区别

    1.内核级线程: (1)线程的创建.撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程.(2)这些线程可以在全系统内进行资源的竞争.(3)内核空间内为每一个内核支持线程设置了一个线 ...

  7. OpenJudge/Poj 1004 Financial Management

    1.链接地址: http://poj.org/problem?id=1004 http://bailian.openjudge.cn/practice/1004 2.题目: 总时间限制: 1000ms ...

  8. Android中的EditText默认时不弹出软键盘的方法

    方法一: 在 AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为 adjustUnspecified|stateHidden <a ...

  9. PHP中使用curlL实现GET和POST请求的方法

    基本结构 (1)初始化 curl_init() (2)设置变量 curl_setopt() .最为重要,一切玄妙均在此.有一长串cURL参数可供设置,它们能指定URL请求的各个细节.要一次性全部看完并 ...

  10. 网站开发常用jQuery插件总结(一)提示插件alertify

    1.alertify插件功能 主要实现提示功能,用于代替js中的alert,confirm,prompt,显示友好的提示框 2.alertify官方地址 http://fabien-d.github. ...