Android滑块开关
来源:互联网 发布:闰年的判断c语言 编辑:程序博客网 时间:2024/04/25 08:59
Android的滑块开关网上已经有很多,我找了好多但是我总觉得都不实用,而且实现也不够简洁不利于维护。于是我把自己以前写的Demo拿出来改了一下使用,也分享给需要的小伙伴,希望对别人有所启发。里面包含自定义View的知识点包括:根据系统测量结果确定自己想要的大小、处理与父布局的事件冲突、使用Scroller实现平滑移动等等。代码量很少,应该还是很好理解的。
每天都要过得开心 ( ゜- ゜)つロ乾杯 !
Demo
Demo地址 https://github.com/wdzawdh/SlideSwitch
效果图
使用方法
有四个属性:打开情况的背景图、关闭情况下的背景图、滑块图、默认开关状态。都有默认值,默认就是金黄背景白色滑块。
<com.cw.slideswitch.view.SlideButton android:id="@+id/sv_but" android:layout_width="25dp" android:layout_height="wrap_content" android:layout_marginTop="10dp" app:openBackground="@drawable/widget_icon_slidebutton_yellow_bg" app:closeBackground="@drawable/widget_icon_slidebutton_write_bg" app:slideImage="@drawable/widget_icon_slidebutton_write_slider" app:isOpen="true"/>SlideButton sv_but = (SlideButton) findViewById(R.id.sv_but);sv_but.setOnSlideButtonChangeListener( new SlideButton.OnSlideButtonChangeListener() { @Override public void onButtonChange(SlideButton view, boolean isOpen) { }});
关键代码
1.onMeasure
当发现宽SpecMode为MeasureSpec.EXACTLY时(也就是具体尺寸或match_parent)就根据宽高比算出高是多少。当宽高都是MeasureSpec.EXACTLY时就按系统测量的原尺寸设置测量宽高(setMeasuredDimension方法)。当没有MeasureSpec.EXACTLY时(也就是宽高都是wrap_content)就根据图片的宽高设置测量宽高。
//计算宽高比float v = (float) mBackground.getWidth() / mBackground.getHeight();if (widthSpecMode == MeasureSpec.EXACTLY && heightSpecMode == MeasureSpec.EXACTLY) { setMeasuredDimension(widthSpecSize, heightSpecSize);} else if (widthSpecMode == MeasureSpec.EXACTLY) { setMeasuredDimension(widthSpecSize, (int) (widthSpecSize / v));} else if (heightSpecMode == MeasureSpec.EXACTLY) { setMeasuredDimension((int) (widthSpecSize * v), heightSpecMode);} else { setMeasuredDimension(mBackground.getWidth(), mBackground.getHeight());}
2.onSizeChanged
ViewGroup给View分配的大小发生变化时,会回调View的onSizeChanged方法,onMeasure结束之后也会调用,所以在onSizeChanged中设置Bitmap的大小。对Bitmap进行等比例缩放,以测量长度与原图长度相差较小的一边为基准缩放bitmap。
if (Math.abs(w - mBackground.getWidth()) < Math.abs(h - mBackground.getHeight())) { setBitMapSize((float) w / mBackground.getWidth());} else { setBitMapSize((float) h / mBackground.getHeight());}
3.dispatchTouchEvent
请求父容器不要拦截事件。由于View的dispatchTouchEvent会把事件直接交给自己的OnTouchEvent方法,所以调用super.dispatchTouchEvent即可。
@Overridepublic boolean dispatchTouchEvent(MotionEvent event) { getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(event);}
PS: 如果有小伙伴觉得我写的有问题或者有优化的地方欢迎提出欢迎评论,一定虚心改进。
阅读全文
0 0
- Android滑块开关
- android之4.0控件switch自定义开关滑块、滑块轨道和宽度
- 使用Scroller制作滑块开关ToggleButton
- 使用Scroller制作滑块开关ToggleButton
- ionicCSS05_切换开关和滑块
- WPF CheckBox 滑块 样式 开关
- Android平台设计规范整理(尺寸+组成元素+字体+操作栏+多面板布局+触摸与反馈+按钮+滑块+开关)
- ios开关和滑块控件操作学习
- 黑马程序员---开关控件滑块控件
- 开关控件、滑块控件和分段控件
- 158,开关按钮,滑块按钮和分段按钮
- 纯css实现开关按钮(滑块)
- android-----开关ActionBar,开关状态栏
- Android unity3d 滑块
- Android星级滑块
- Android快捷开关实现 Wifi开关、蓝牙开关、GPS开关、同步开关、亮度设置开关
- iphone开发之基本UI控件(Button控件,开关控件,分段控件,滑块控件,WebView)
- ios学习笔记——简单控件(开关、分段控件、滑块)
- 从字节码角度分析接口中的成员域
- 横竖屏播放视频
- ServletContext对象
- 对象模型(一)
- maven项目报错Failed to execute goal org.apache.maven.plugins
- Android滑块开关
- web浏览器无插件播放实时音视频技术---方案选择(一)
- 只为成功找方法,不为失败找借口! javaweb学习总结(五)——Servlet开发(一)
- Linux 下安装mysql
- JVM学习02——对象的创建与访问
- Java中的方法的传参和构造方法
- 数据结构及算法知识(三)
- POJ
- 使用递归来实现双向链表里删除第一节点不是数字‘2’