您的位置:首页 > 移动开发 > Android开发

Android自定义控件之滑动开关

2015-09-19 02:28 218 查看
滑动开关
效果展示:

一、创建工程,自定义布局

1、在布局文件中使用自定义的view:需要加上类的全名(包名)

2、在布局文件中使用自定义的View,设置相应的宽高等



二、自定义控件:

1、创建类继承View,添加构造方法

2、绘制需要一些资源图片,拷贝到工程中

3、创建方法,指定开关样式:

*通过BitmapFactory的方法decodeResource方法加载资源图片:

分别获取开关开启和关闭的背景图并获取滑动块图片:

4、进行绘制

*指定开关样式,绘制当前控件,使用onDraw方法



①绘制背景

通过canvas绘制背景图,drawBitmap

参数1:指定图片资源

参数2:创建矩阵,指定图像样式

参数3:创建画笔

需要判断滑动块当前的位置:

滑动块的中心点坐标大于关闭背景宽度的一半,绘制图片为开启样式

滑动块的中心点坐标小于关闭背景宽度的一半,绘制图片为关闭样式

②绘制滑动按钮

通过canvas绘制按钮,drawBitmap

参数1:指定图片资源:滑动块

参数2:指定距离左边的距离

参数3:指定距离上边的距离

参数4:创建画笔

进行判断:

滑动状态:

滑动块的中心点坐标大于关闭背景宽度的一半,设置滑动块的左边距离为关闭背景的宽度减去滑动块的宽度

滑动块的中心点坐标小于关闭背景宽度的一半,设置滑动块的左边距离为滑动块的中心点坐标减去开关背景的宽度的一半

非滑动状态:

开关处于开启状态:设置滑动块的左边距离为关闭背景的宽度减去滑动块的宽度

开关处于关闭状态:设置滑动块的左边距离为0

处理开关边缘:

判断滑块左边的距离:

小于0时:防止滑出开关背景的范围,设置为0【根据实际开关的位置设置,不出开关背景即可】

超出[开关背景和滑块宽度差值]的长度,设置为[开关背景和滑块宽度差值]



3、动态调整滑动块

重写触摸事件onTouchEvent:

MotionEvent.ACTION_DOWN:手指按下的事件

记录当前滑块的坐标:currentX = event.getX();

将滑动的状态改为true,可以滑动

MotionEvent.ACTION_MOVE:手指移动的事件

记录当前滑块的坐标:currentX = event.getX();

MotionEvent.ACTION_UP:手指松开的事件

将滑块的状态改为false,不可滑动

在松开的时候,判断滑块的位置是否大于背景的一半:

大于:将开关的状态改为开启状态:isSwitchOn = true;

小于:将开关的状态改为关闭状态:isSwitchOn = false;



改进处:

在MotionEvent.ACTION_UP中:

添加判断:

如果注册了开关监听器,同时开关的状态发生了改变的时候

设置监听器监听的开关状态为相应的状态(开或关)

并将前一个状态进行更新{需要先定义一个原先开关的状态的标记}



5、指定开关的默认状态:

创建方法,设置开关的默认状态:setSwitchStatus(boolean status)

6、定义开关状态改变的监听器

定义抽象方法:开关状态改变的方法

7、对外提供回调方法:

接收的参数为监听的接口,其中将监听器传给定义的全局的“开关监听器”



三、Activity中实现效果:

1、找到控件,选择自定义的控件

2、指定开关样式:

toggle.setSwitchStyle(R.drawable.bkg_switch,R.drawable.bkg_switch, R.drawable.btn_slip);

3、指定开关的默认状态

toggle.setSwitchStatus(true);

4、添加开关状态改变监听器

当开关状态开启或关闭的时候进行相关的操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: