转于:
http://blog.csdn.net/vipzjyno1/article/details/23707149
--------------------------------------------------------------------------------------------------
刚开始接触开关样式的按钮是在IOS系统上面,它的切换以及滑动十分帅气,深入人心。
所谓的开关按钮,就是只有2个状态:on和off,下图就是系统IOS 7上开关按钮效果。
起初我在android上我只会使用CheckBox去满足对应的功能。后来,查看开发文档发现,android也有了自己的原生态开关控件,并且在4.0版本中又优化加入了新的类似控件--Switch控件,以及使用起来十分简单的ToggleButton,可是它们只是带有切换效果,而不带有滑动切换效果,并且Switch控件只支持高版本的系统,对于2.3就不支持。所以,要想看如何实现滑动切换的效果,必须了解这些控件的实现方式。下面,让我们查看下android开发文档,看看这些是如何实现使用的。
注意:本文中涉及到自定义控件 并自定义配置属性declare-styleable,
如果你对于自定义控件的自定义配置属性还不是很了解可以看:android 自定义控件 使用declare-styleable进行配置属性(源码角度)
查看查看开发文档:
CompoundButton
extends Button
implements Checkable
↳ |
||||
|
↳ |
|||
|
|
↳ |
||
|
|
|
↳ |
android.widget.CompoundButton |
Known Direct Subclasses |
以上4类都是开关类型切换的控件,它们的父类都是CompoundButton。
它对应的方法和类有:
点击选择监听接口。
Nested Classes |
||
interface |
Interface definition for a callback to be invoked when the checked state of a compound button changed. |
返回左右填充的VIEW,加上间隔
Public Methods |
|
int |
getCompoundPaddingLeft()Returns the left padding of the view, plus space for the left Drawable if any. |
int |
getCompoundPaddingRight()Returns the right padding of the view, plus space for the right Drawable if any. |
boolean:是否被选中。
boolean |
设置Button的Drawable属性
void |
setButtonDrawable(int resid)Set the background to a given Drawable, identified by its resource id. |
设置是否选中
void |
setChecked(boolean checked)Changes the checked state of this button. |
改变当前的状态,true-->false ;false-->true
void |
toggle()Change the checked state of the view to the inverse of its current state |
控件全局 绘制
void |
protected void onDraw (Canvas canvas)
实现你自己的绘制。
参数
canvas 在画布上绘制背景
protected boolean verifyDrawable (Drawable who)
如果你的视图子类显示他自己的可视化对象,他将要重写此方法并且为了显示可绘制返回true。此操作允许进行绘制时有动画效果。
确认当重写从方法时,需调用父类相应方法。
参数
who 需判断的可绘制对象(Drawable)。如果是你要显示的对象,返回True,否则返回调用父类的结果。
返回值
boolean 如果可绘制对象(Drawable)已经在视图中显示,返回True否则返回false。并且此处不允许使用动画。
下面让我们来看看如何实现这个效果把:
一.使用ToggleButton控件实现:
使用ToggleButton控件十分方便,你可以看作他为一个CheckBox,只用设置它的button、background等几个属性即可。
首先:res--创建drawable文件夹 -- 创建switch_btn.xml资源文件--作以下配置
- <?xml version="1.0" encoding="utf-8"?>
- <selector
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_checked="true" android:drawable="@drawable/ios7_switch_on" />
- <item android:drawable="@drawable/ios7_switch_off" />
- </selector>
其中:android:state_checked="true" 表示选中on时候的,效果为:android:drawable="@drawable/ios7_switch_on"
反之就是未选中off情况下的效果:android:drawable="@drawable/ios7_switch_off"
之后在布局文件中写控件:
- <ToggleButton
- android:id="@+id/mTogBtn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:background="@android:color/transparent"
- android:button="@drawable/toggle_btn"
- android:checked="false"
- android:text=""
- android:textOff=""
- android:textOn="" />
这里的
android:textOn="" 表示:选中情况下显示的文本
android:textOff="" 表示:未选中情况下显示的文本
android:checked="false" 表示:初始化时候,默认是未选中的
android:button="@drawable/toggle_btn" 表示:button样式
android:background="@android:color/transparent" 表示:背景,这里不用它的默认背景,所以设置为透明
之后在主程序中实例化,并设置checked点击监听
- ToggleButton mTogBtn = (ToggleButton) findViewById(R.id.mTogBtn); // 获取到控件
- mTogBtn.setOnCheckedChangeListener(new OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
- // TODO Auto-generated method stub
- if(isChecked){
- //选中
- }else{
- //未选中
- }
- }
- });// 添加监听事件
这样ToggleButton的开关切换就轻松实现了。
二.重写CompoundButton控件实现带滑动效果的开关按钮:
重写CompuundButton的实现可能会显得相对繁琐些,主要是考虑状态是否已经选中等情况的文字显示。
可以查看官方文档,之后继承CompuundButton,在布局的动画和显示上调用onDraw(Canvas canvas)重画既可以,如果想要加入拖动属性,那么在该VIEW内重写触摸事件onTouchEvent(MotionEvent ev)在里面判断拖动距离,之后根据拖动情况判断开关是on还是off。
由于继承的是CompoundButton,所以里面的监听方法,setChecked等方法都是自带的,继承下来写操作就可以了,不用自己在去加判断什么的属性了。
由于DEMO中的继承CompoundButton的SwitchButton是使用自定义配置的,所以如果不了解自定义配置的可以看以下文章:android 自定义控件 使用declare-styleable进行配置属性(源码角度)
具体的这边不贴代码了,可以查看DEMO里面的,都有注释。
三.重写CheckBox控件实现带滑动效果的开关按钮:
其实,看上面给的开发文档内容,大家都可以知道,CheckBox其实就是继承CompoundButton控件的,只是重构CheckBox会比CompoundButton方便好多,里面的很多方法都是写好的,只要自己去判断触摸事件onTouchEvent(MotionEvent ev),以及onDraw(Canvas canvas)重画就可以。这里DEMO中使用到的是第3放库内的一个控件,大致操作和上面其实大同小异。
四.重写View实现带滑动效果的开关按钮:
众所周知,以上所有的控件都是继承了View这个父类,所以,如果你用View去操作的话,就没有自带方法的限制,可是要满足你要 实现的SwitchButton效果,你必须自己写开关状态监听接口,并且自己写setChecked方法实现同等的效果。在优化方面要自己多加细心考虑。其他操作与以上控件的重构大同小异。
注意:由于状态切换等,enabled属性改变等,是你自定义的方法内的话,你必须自己去调用invalidate();方法,去让UI判断是否有更改并做出相应的变化。
例如:
- @Override
- public void setEnabled(boolean enabled) {
- // TODO Auto-generated method stub
- mEnabled = enabled;
- mAlpha = enabled ? MAX_ALPHA : MAX_ALPHA/2;
- Log.d("enabled",enabled ? "true": "false");
- super.setEnabled(enabled);
- invalidate();
- }
- /** 自动判断切换至相反的属性 : true -->false ;false -->true */
- public void toggle() {
- setChecked(!mSwitchOn);
- }
- /** 设置选中的状态(选中:true 非选中: false) */
- public void setChecked(boolean checked) {
- mSwitchOn = checked;
- invalidate();
- }
还有,你如果是自定义的VIEW,你在里面设置了enabled属性,你必须在onTouchEvent(MotionEvent event)触摸操作的时候判断你所设置的enabled属性是否为true,是的话就可以相应点击事件,否则的话你要屏蔽掉点击事件。因为你自定义的view中的enabled属性并不知道他设定后会达到什么效果,这些都是要注意的点。
还有就是要设置接口监听状态变化:
- /**
- * 设置 switch 状态监听
- * */
- public void setOnChangeListener(OnSwitchChangedListener listener) {
- switchListener = listener;
- }
- /**
- * switch 开关监听接口
- * */
- public interface OnSwitchChangedListener{
- public void onSwitchChange(SlideSwitchView switchView, boolean isChecked);
- }
有的人可能会希望有SwitchButton在enabled设置为false的时候,SwitchButton不能点击且要改变颜色,使他看过去是不能点击的。你可以进行如下操作(在学习别的人代码中得到的提示,学以致用):
先初始化透明度:255为不透明
- /** 最大透明度,就是不透明 */
- private final int MAX_ALPHA = 255;
- /** 当前透明度,这里主要用于如果控件的enable属性为false时候设置半透明 ,即不可以点击 */
- private int mAlpha = MAX_ALPHA;
之后重写setEnabled方法,通过这个方法判断enabled属性值
- @Override
- public void setEnabled(boolean enabled) {
- // TODO Auto-generated method stub
- mEnabled = enabled;
- mAlpha = enabled ? MAX_ALPHA : MAX_ALPHA/2;
- super.setEnabled(enabled);
- invalidate();
- }
如果改变了enabled属性,系统便会查看UI是否需要变化,之后在UI方法onDraw(Canvas canvas)中调用:
- android.graphics.Canvas.saveLayerAlpha(RectF bounds, int alpha, int saveFlags)
方法,其中的第2个属性alpha就是透明度,之后便可以实现相应的效果。
由于目前对于重写VIEW的onDraw方法的了解不是很深入,所以这里的DEMO中的几个方法都是查看网络之后加上自己的优化和注释演变过来,等这一块深入了后在重写写一篇关于这个的感受和使用说明。由于可能理解不是很深刻,如果有什么不足之处可以提出,谢谢。
最后让我们来看看效果如何,上图:
最后上源码DEMO:下载地址
相关推荐
本文将详细讨论`SwitchButton`的多种实现方式,以及如何自定义`CompoundButton`来满足特定需求。 首先,`SwitchButton`是Android SDK中的一个内置组件,属于`CompoundButton`类的子类。`CompoundButton`是`CheckBox...
最近做项目时 ,有设置界面的开关按钮然后发现一个特别好用的SwitchButton,在这里记录一下,之前很多东西都没用记录,现在我开始记录一些好用的东西,Android SwitchButton 开关按钮 demo,大家参考后可根据自己需求...
重写CompoundButton控件实现带滑动效果的开关按钮: 重写CompuundButton的实现可能会显得相对繁琐些,主要是考虑状态是否已经选中等情况的文字显示。 可以查看官方文档,之后继承CompuundButton,在布局的动画和...
SwitchButton开关按钮的多种实现方式.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
本篇将深入探讨`SwitchButton`的多种实现方式,包括原生API的使用、自定义控件以及与业务逻辑的结合。 一、原生API实现`SwitchButton` Android SDK提供了`SwitchCompat`(在`androidx.appcompat.widget`包中)或`...
本文将详细探讨SwitchButton开关按钮的多种实现方式,包括基本使用、自定义样式以及与数据绑定的交互。 1. 基本使用 Android SDK提供了SwitchCompat控件(位于androidx.appcompat.widget包下),它是对原生Switch的...
项目描述:这个项目展示了多种实现开关按钮(Switch Button)的方式。通过使用不同的技术,包括Swing和JavaFX,我们演示了如何创建一个简单的开关按钮,并在用户操作时切换按钮的状态。这个项目旨在帮助开发人员了解...
这是一个收集有8款不同风格样式的SwitchButton按钮实例集效果,这些按钮可以用作程序设置的功能开关,比如...本源码中的示例集有8款,都是很漂亮的开关按钮,也可直接用在移动手机应用开发中,局部按钮效果如下图所示。
这个`SwitchButton`控件由三个主要类组成,它们协同工作来实现开关效果: 1. **SwitchButton**:这个类继承自`CheckBox`,是自定义控件的核心。它覆盖了`CheckBox`的一些默认行为,以实现滑动切换的功能。类中包含...
在提供的`TestSwitchBtn`文件中,我们可以看到一个实际的自定义`SwitchButton`示例,通过查看和分析这个文件,可以学习到如何实现一个与iPhone相似的滑动开关按钮。具体实现细节可能包括XML布局文件的调整、自定义...
在Android开发中,为了提供与iOS相似的用户体验,开发者经常需要实现类似iOS的开关按钮,即SwitchButton。这种控件通常用于用户在两种状态之间进行切换,如打开/关闭、开启/禁用等。本篇将详细介绍如何在Android中...
`SwitchButton`是Android SDK中的`android.widget.Switch`类,它结合了单选按钮和复选框的特点,用户可以通过滑动来改变其状态。 ### 1. `SwitchButton`的基本使用 在布局XML文件中,我们可以通过`<Switch>`标签来...
本篇文章将深入探讨如何使用画图方式实现一个自定义的`SwitchButton`,以此来提供一种简洁且高效的解决方案。 `SwitchButton`是Android系统自带的一种开关控件,通常用于切换两种状态,如开启或关闭、选择与否。...
标题中的“开关按钮选择器switchbutton”可能是指开发者创建了一个自定义的`View`类来扩展或改进原生Android提供的`SwitchCompat`或`Switch`组件。自定义视图通常是为了满足特定设计需求,如添加额外的交互效果、...
在Android开发中,`...总的来说,"SwitchButton的Demo"是一个很好的学习资源,它不仅展示了`SwitchButton`的基本用法,还可能包含了一些创新的实现,对于提升Android开发者的UI设计能力和交互体验理解都非常有帮助。
仿iOS的开关(Switch)按钮控件源码,源码switchbtn,iOS的SwitchButton深入人心,也被Android上的产品设计借鉴,在Android4.0中,系统就带有原生的Switch控件了。但是在老版本的Android上,怎样实现这个功能呢?最...
"SwitchButton"是一种特殊的按钮,通常用于实现开关或选择功能,它结合了普通按钮和滑动开关的特性,让用户能够直观地开启或关闭某个功能。在本文中,我们将深入探讨如何在Android中实现"SwitchButton"按钮效果。 ...
在Android开发中,UI设计是至关重要的一环,而SwitchButton作为一个功能丰富的开关按钮控件,为开发者提供了更多自定义和交互的可能性。这个开源项目“switch-button”为Android应用的界面增添了一份独特的魅力。 ...
首先,`switchbutton.cpp`和`switchbutton.h`是自定义开关按钮的核心代码。在`switchbutton.h`中,你需要声明一个继承自QAbstractButton的类,例如`SwitchButton`,并添加必要的属性和方法来控制开关状态和颜色。在`...
所谓的开关按钮,就是只有2个状态:on和off,下图就是系统IOS 7上开关按钮效果。 起初我在android上我只会使用CheckBox去满足对应的功能。后来,查看开发文档发现,android也有了自己的原生态开关控件,并且在4.0...