服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android自定义控件仿iOS滑块SwitchButton

Android自定义控件仿iOS滑块SwitchButton

2022-09-07 15:44王世晖 Android

这篇文章主要为大家详细介绍了Android自定义控件模仿iOS滑块SwitchButton,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

switchbutton可以点击的时候切换状态,类似checkbox

在拖动的时候,也可以根据拖动的距离判断是否切换状态,类似togglebutton

因此要区别出单击事件和拖动事件

实现效果如图所示:

Android自定义控件仿iOS滑块SwitchButton

自定义的switchbutton如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
public class switchbutton extends view implements view.ontouchlistener {
 private bitmap bg_on, bg_off, slipper_btn;
 /**
 * 按下时的x和当前的x
 */
 private float downx, nowx;
 /**
 * 记录用户是否在滑动
 */
 private boolean onslip = false;
 /**
 * 当前的状态
 */
 private boolean nowstatus = false;
 /**
 * 监听接口
 */
 private onchangedlistener listener;
 /**
 * 一个滑动的距离临界值,判断是滑动还是点击
 * getscaledtouchslop():
 * distance in pixels a touch can wander before we think the user is scrolling
 * */
 private int mtouchslop=new viewconfiguration().getscaledtouchslop();
 
 public switchbutton(context context) {
 super(context);
 init();
 }
 public switchbutton(context context, attributeset attrs) {
 super(context, attrs);
 init();
 }
 public void init(){
 //载入图片资源
 bg_on = bitmapfactory.decoderesource(getresources(), r.mipmap.switch_on_on);
 bg_off = bitmapfactory.decoderesource(getresources(), r.mipmap.switch_off_off);
 slipper_btn = bitmapfactory.decoderesource(getresources(), r.mipmap.switch_ball_ball);
 setontouchlistener(this);
 }
 protected void ondraw(canvas canvas) {
 super.ondraw(canvas);
 matrix matrix = new matrix();
 paint paint = new paint();
 float x = 0;
 //根据nowx设置背景,开或者关状态
 if (nowx < (bg_on.getwidth()/2)){
 canvas.drawbitmap(bg_off, matrix, paint);//画出关闭时的背景
 }else{
 canvas.drawbitmap(bg_on, matrix, paint);//画出打开时的背景
 }
 if (onslip) {//是否是在滑动状态,
 if(nowx >= bg_on.getwidth())//是否划出指定范围,不能让滑块跑到外头,必须做这个判断
 x = bg_on.getwidth() - slipper_btn.getwidth()/2;//减去滑块1/2的长度
 else
 x = nowx - slipper_btn.getwidth()/2;
 }else {
 if(nowstatus){//根据当前的状态设置滑块的x值
 x = bg_on.getwidth() - slipper_btn.getwidth();
 }else{
 x = 0;
 }
 }
 //对滑块滑动进行异常处理,不能让滑块出界
 if (x < 0 ){
 x = 0;
 }
 else if(x > bg_on.getwidth() - slipper_btn.getwidth()){
 x = bg_on.getwidth() - slipper_btn.getwidth();
 }
 //画出滑块
 canvas.drawbitmap(slipper_btn, x, 0, paint);
 }
 
 @override
 public boolean ontouch(view v, motionevent event) {
 switch(event.getaction()){
 case motionevent.action_down:{
 if (event.getx() > bg_off.getwidth() || event.gety() > bg_off.getheight()){
 return false;
 }else{
 onslip = true;
 downx = event.getx();
 nowx = downx;
 }
 break;
 }
 case motionevent.action_move:{
 nowx = event.getx();
 break;
 }
 case motionevent.action_up:{
 debuglog.e("mtouchslop:"+mtouchslop);
 onslip = false;
 nowx = event.getx();
 float float_distance=nowx - downx;
 int int_disatnce=(int)float_distance;
 debuglog.e("int_disatnce:"+int_disatnce);
 /**
 * 滑动距离太短,认定是点击事件
 */
 if(math.abs(int_disatnce)<mtouchslop){
 if(this.ischecked()){
 this.setchecked(false);
 nowx = 0;
 }else{
 this.setchecked(true);
 nowx = bg_on.getwidth() - slipper_btn.getwidth();
 }
 }else{
 /**
 * 滑动距离足够,认为是滑动事件
 */
 if(event.getx() >= (bg_on.getwidth()/2)){
 nowstatus = true;
 nowx = bg_on.getwidth() - slipper_btn.getwidth();
 }else{
 nowstatus = false;
 nowx = 0;
 }
 }
 if(listener != null){
 listener.onchanged(switchbutton.this, nowstatus);
 }
 break;
 }
 }
 //刷新界面
 invalidate();
 return true;
 }
 /**
 * 为wiperswitch设置一个监听,供外部调用的方法
 * @param listener
 */
 public void setonchangedlistener(onchangedlistener listener){
 this.listener = listener;
 }
 /**
 * 设置滑动开关的初始状态,供外部调用
 * @param checked
 */
 public void setchecked(boolean checked){
 if(checked){
 nowx = bg_off.getwidth();
 }else{
 nowx = 0;
 }
 nowstatus = checked;
 }
 public boolean ischecked() {
 return nowstatus;
 }
 /**
 * 回调接口
 *
 */
 public interface onchangedlistener {
 public void onchanged(switchbutton wiperswitch, boolean checkstate);
 }
}

布局文件中使用:

?
1
2
3
4
5
<com.uestcneon.chuji.changjianglife.share.switchbutton
 android:id="@+id/user_privacy_state"
 android:layout_width="wrap_content"
 android:layout_height="20dp"
 android:layout_marginleft="30dp" />

控件用到的3个资源图片:

Android自定义控件仿iOS滑块SwitchButtonAndroid自定义控件仿iOS滑块SwitchButtonAndroid自定义控件仿iOS滑块SwitchButton

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/wangshihui512/article/details/50900420

延伸 · 阅读

精彩推荐
  • Androidandroid ImageView 的几点经验总结

    android ImageView 的几点经验总结

    本篇文章是对android中ImageView的使用技巧进行了几点经验总结,需要的朋友参考下...

    Android开发网7262021-01-31
  • AndroidAndroid 屏幕截屏方法汇总

    Android 屏幕截屏方法汇总

    这篇文章主要介绍了Android 屏幕截屏方法汇总的相关资料,需要的朋友可以参考下...

    mmsx7662021-05-24
  • AndroidAndroid编程之简单逐帧动画Frame的实现方法

    Android编程之简单逐帧动画Frame的实现方法

    这篇文章主要介绍了Android编程之简单逐帧动画Frame的实现方法,结合实例较为详细的分析了Android逐帧动画的原理、步骤与具体实现技巧,需要的朋友可以参考...

    Sunnyfans5522021-04-22
  • AndroidAndroid使用线程更换壁纸

    Android使用线程更换壁纸

    这篇文章主要为大家详细介绍了Android使用线程更换壁纸的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    水中鱼之19997332022-08-28
  • Android自定义Android六边形进度条(附源码)

    自定义Android六边形进度条(附源码)

    这篇文章主要介绍了自定义Android六边形进度条,本文设计的进度条是六边形的,对进度条感兴趣的小伙伴们可以参考一下...

    jackeysun60323712021-05-26
  • AndroidAndroid中PreferenceFragment的使用详解

    Android中PreferenceFragment的使用详解

    本文主要介绍了Android中PreferenceFragment的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    这个杀手不太累9872021-12-23
  • AndroidAndroid签名知识小结

    Android签名知识小结

    不止一次有用到Android签名相关的知识,每次都几乎从零开始在Google上搜索找,不想在继续这样了,找了个时间好好整理了一下自己用到的一些碎片知识,于...

    Android开发网11502021-06-24
  • AndroidAndroid编程实现TextView部分颜色变动的方法

    Android编程实现TextView部分颜色变动的方法

    这篇文章主要介绍了Android编程实现TextView部分颜色变动的方法,涉及Android针对TextView样式操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    lee0oo06852021-04-14