一种基于复杂环境下实现开关可滑动可点击的方法
【技术领域】
[0001]本发明涉及安卓系统技术领域,特别涉及一种基于复杂环境下实现开关可滑动可点击的方法。
【背景技术】
[0002]Android (安卓)开关的切换从4.0 (API 14)(应用程序编程接口)开始引入新的控件Switch,此外还有用起来简单的ToggleButton (开关),或者用CheckBox (复选框)或者用两张图片点击切换。但是这些都存在不足之处,不能实现滑动切换,使用CheckBox时还会存在焦点冲突的问题。通过对Android原生控件的实现方式进行研究,实现自定义可点击可滑动的开关其实并不难,但是需要注意的是,如果放在稍微复杂的环境中,原本运行完美的滑动点击的开关,往往会出现卡顿甚至不能正常开关的情况。
【发明内容】
[0003]本发明要解决的技术问题,在于提供一种基于复杂环境下实现开关可滑动可点击的方法,使得控件能够完美适用各种简单或者复杂的应用场景,不会出现卡顿甚至不能正常开关的情况。
[0004]本发明的技术问题是这样实现的:一种基于复杂环境下实现开关可滑动可点击的方法,所述方法包括如下步骤:
[0005]步骤1、在复杂环境下创建一开关类SuperButton,获得该开关类SuperButton的背景图片所占的大小作为一开关视图的大小,并将该开关视图绘制到屏幕上;
[0006]步骤2、开关视图显示后,对开关视图加入点击和滑动的控制逻辑;
[0007]所述点击的控制逻辑为:通过重写onClick(view)方法控制点击事件,设定一个表示开关状态的变量,根据该变量的值来改变滑动开关的位置,并刷新屏幕的界面;
[0008]所述滑动的控制逻辑为:对触摸事件进行处理,重写onTouchEvent (event)方法:当发生按下事件时,记录按下位置;当发生移动事件时,根据手指按在开关滑块上的移动距离实时刷新界面;当发生抬起事件时,根据此时开关滑块的移动距离判断开关状态,并刷新界面;
[0009]步骤3、接收手指对开关视图的滑动或点击事件,完成开关的滑动或点击处理。
[0010]进一步地,所述步骤1具体为:创建一开关类SuperButton,所述开关类SuperButton继承开关控件的父类View,通过构造方法创建开关对象,调用onMeasure(int, int)方法测量开关对象的背景图片所占的大小作为开关视图的大小,并调用onDraw(canvas)方法将该开关视图绘制到屏幕上。
[0011]进一步地,所述步骤2中根据该变量的值来改变滑动开关的位置,具体为:所述变量为布尔类型,变量初始值设置为true,表示开的状态,当发生点击事件后,将变量的值改为false,再点击时,将变量的值改为true,以此类推;改变变量的值后,要同时修改开关滑块距离界面左边界的值;其中,开关开的时候开关滑块距离界面左边界的值为开关视图的长度减去开关滑块的长度,开关关的时候开关滑块距离界面左边界的值为0。
[0012]进一步地,所述根据手指按在开关滑块上的移动距离实时刷新界面,具体为:根据手指按在开关滑块上的移动距离来改变开关滑块距离界面左边界的值,当这个值等于最大值时就不再变大,所述最大值为开关视图的长度减去开关滑块的长度,开关滑块的移动距离变化时,界面也随之刷新。
[0013]进一步地,所述根据此时开关滑动的距离判断开关状态,具体为:根据此时开关滑动的距离是否超过所述最大值的一半判断开关状态,若超过最大值,开关状态为开,否则,开关状态为关,并刷新界面。
[0014]进一步地,所述复杂环境包括:滑动类及滚动类的视图控件,继承自容器类的控件ViewGroup的自定义控件,或者原生控件的环境下;所述滑动类及滚动类的视图控件包括ViewPager 控件、ListView 控件、ScrollView 控件、Horizontal Scroll View 控件。
[0015]进一步地,在复杂环境的外部控件对外部触摸事件处理的情况下,开关的触摸事件将与所述外部触摸事件的处理产生冲突,而开关的触摸事件无法得到执行时,要重写dispatchTouchEvent (Mot1nEvent event)方法,在这个方法内部调用 requestDisallowInterceptTouchEvent (true)方法,请求外部控件的父控件不要拦截开关的触摸事件,让开关类SuperButton自己处理发生的开关的触摸事件;所述开关的触摸事件包括:按下事件、移动事件或抬起事件。
[0016]本发明的优点在于:本发明通过研究Android原生控件的实现原理,实现可以滑动点击的自定义开关,并针对目前常见的控件存在的问题,修改自定义开关的触摸(Touch)事件的处理,使得控件能够完美适用各种简单或者复杂的应用场景,不会出现卡顿甚至不能正常开关的情况。
【附图说明】
[0017]图1为本发明的方法流程示意图。
[0018]图2为本发明滑动的控制逻辑的流程示意图。
[0019]图3为本发明开关的触摸事件将与所述外部触摸事件的处理产生冲突情况下,滑动的控制逻辑的流程示意图。
【具体实施方式】
[0020]请参阅图1至图3所示,本发明的一种基于复杂环境下实现开关可滑动可点击的方法,所述方法包括如下步骤:
[0021]步骤1、在复杂环境下创建一开关类SuperButton,获得该开关类SuperButton的背景图片所占的大小作为一开关视图的大小,并将该开关视图绘制到屏幕上;所述步骤1具体为:创建一开关类SuperButton,所述开关类SuperButton继承开关控件的父类View,通过构造方法创建开关对象,调用0nMeaSUre(int,int)方法测量开关对象的背景图片所占的大小作为开关视图的大小,并调用onDraw (canvas)方法将该开关视图绘制到屏幕上。所述复杂环境包括:滑动类及滚动类的视图控件,继承自容器类的控件ViewGroup的自定义控件,或者原生控件的环境下;所述滑动类及滚动类的视图控件包括ViewPager控件、ListView 控件、ScrollView 控件、Horizontal Scroll View 控件。
[0022]步骤2、开关视图显示后,对开关视图加入点击和滑动的控制逻辑;
[0023]所述点击的控制逻辑为:通过重写onClick(view)方法控制点击事件,设定一个表示开关状态的变量,根据该变量的值来改变滑动开关的位置,并刷新屏幕的界面;这样就实现了点击改变开关状态。
[0024]所述步骤2中根据该变量的值来改变滑动开关的位置,具体为:所述变量为布尔类型,变量初始值设置为true,表不开的状态,当发生点击事件后,将变量的值改为false,再点击时,将变量的值改为true,以此类推;改变变量的值后,要同时修改开关滑块距离界面左边界的值;其中,本实施例中,开关开的时候开关滑块距离界面左边界的值为开关视图的长度减去开关滑块的长度,开关关的时候开关滑块距离