一種基于復(fù)雜環(huán)境下實(shí)現(xiàn)開關(guān)可滑動可點(diǎn)擊的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及安卓系統(tǒng)技術(shù)領(lǐng)域,特別涉及一種基于復(fù)雜環(huán)境下實(shí)現(xiàn)開關(guān)可滑動可點(diǎn)擊的方法。
【背景技術(shù)】
[0002]Android (安卓)開關(guān)的切換從4.0 (API 14)(應(yīng)用程序編程接口)開始引入新的控件Switch,此外還有用起來簡單的ToggleButton (開關(guān)),或者用CheckBox (復(fù)選框)或者用兩張圖片點(diǎn)擊切換。但是這些都存在不足之處,不能實(shí)現(xiàn)滑動切換,使用CheckBox時(shí)還會存在焦點(diǎn)沖突的問題。通過對Android原生控件的實(shí)現(xiàn)方式進(jìn)行研究,實(shí)現(xiàn)自定義可點(diǎn)擊可滑動的開關(guān)其實(shí)并不難,但是需要注意的是,如果放在稍微復(fù)雜的環(huán)境中,原本運(yùn)行完美的滑動點(diǎn)擊的開關(guān),往往會出現(xiàn)卡頓甚至不能正常開關(guān)的情況。
【發(fā)明內(nèi)容】
[0003]本發(fā)明要解決的技術(shù)問題,在于提供一種基于復(fù)雜環(huán)境下實(shí)現(xiàn)開關(guān)可滑動可點(diǎn)擊的方法,使得控件能夠完美適用各種簡單或者復(fù)雜的應(yīng)用場景,不會出現(xiàn)卡頓甚至不能正常開關(guān)的情況。
[0004]本發(fā)明的技術(shù)問題是這樣實(shí)現(xiàn)的:一種基于復(fù)雜環(huán)境下實(shí)現(xiàn)開關(guān)可滑動可點(diǎn)擊的方法,所述方法包括如下步驟:
[0005]步驟1、在復(fù)雜環(huán)境下創(chuàng)建一開關(guān)類SuperButton,獲得該開關(guān)類SuperButton的背景圖片所占的大小作為一開關(guān)視圖的大小,并將該開關(guān)視圖繪制到屏幕上;
[0006]步驟2、開關(guān)視圖顯示后,對開關(guān)視圖加入點(diǎn)擊和滑動的控制邏輯;
[0007]所述點(diǎn)擊的控制邏輯為:通過重寫onClick(view)方法控制點(diǎn)擊事件,設(shè)定一個(gè)表示開關(guān)狀態(tài)的變量,根據(jù)該變量的值來改變滑動開關(guān)的位置,并刷新屏幕的界面;
[0008]所述滑動的控制邏輯為:對觸摸事件進(jìn)行處理,重寫onTouchEvent (event)方法:當(dāng)發(fā)生按下事件時(shí),記錄按下位置;當(dāng)發(fā)生移動事件時(shí),根據(jù)手指按在開關(guān)滑塊上的移動距離實(shí)時(shí)刷新界面;當(dāng)發(fā)生抬起事件時(shí),根據(jù)此時(shí)開關(guān)滑塊的移動距離判斷開關(guān)狀態(tài),并刷新界面;
[0009]步驟3、接收手指對開關(guān)視圖的滑動或點(diǎn)擊事件,完成開關(guān)的滑動或點(diǎn)擊處理。
[0010]進(jìn)一步地,所述步驟1具體為:創(chuàng)建一開關(guān)類SuperButton,所述開關(guān)類SuperButton繼承開關(guān)控件的父類View,通過構(gòu)造方法創(chuàng)建開關(guān)對象,調(diào)用onMeasure(int, int)方法測量開關(guān)對象的背景圖片所占的大小作為開關(guān)視圖的大小,并調(diào)用onDraw(canvas)方法將該開關(guān)視圖繪制到屏幕上。
[0011]進(jìn)一步地,所述步驟2中根據(jù)該變量的值來改變滑動開關(guān)的位置,具體為:所述變量為布爾類型,變量初始值設(shè)置為true,表示開的狀態(tài),當(dāng)發(fā)生點(diǎn)擊事件后,將變量的值改為false,再點(diǎn)擊時(shí),將變量的值改為true,以此類推;改變變量的值后,要同時(shí)修改開關(guān)滑塊距離界面左邊界的值;其中,開關(guān)開的時(shí)候開關(guān)滑塊距離界面左邊界的值為開關(guān)視圖的長度減去開關(guān)滑塊的長度,開關(guān)關(guān)的時(shí)候開關(guān)滑塊距離界面左邊界的值為0。
[0012]進(jìn)一步地,所述根據(jù)手指按在開關(guān)滑塊上的移動距離實(shí)時(shí)刷新界面,具體為:根據(jù)手指按在開關(guān)滑塊上的移動距離來改變開關(guān)滑塊距離界面左邊界的值,當(dāng)這個(gè)值等于最大值時(shí)就不再變大,所述最大值為開關(guān)視圖的長度減去開關(guān)滑塊的長度,開關(guān)滑塊的移動距離變化時(shí),界面也隨之刷新。
[0013]進(jìn)一步地,所述根據(jù)此時(shí)開關(guān)滑動的距離判斷開關(guān)狀態(tài),具體為:根據(jù)此時(shí)開關(guān)滑動的距離是否超過所述最大值的一半判斷開關(guān)狀態(tài),若超過最大值,開關(guān)狀態(tài)為開,否則,開關(guān)狀態(tài)為關(guān),并刷新界面。
[0014]進(jìn)一步地,所述復(fù)雜環(huán)境包括:滑動類及滾動類的視圖控件,繼承自容器類的控件ViewGroup的自定義控件,或者原生控件的環(huán)境下;所述滑動類及滾動類的視圖控件包括ViewPager 控件、ListView 控件、ScrollView 控件、Horizontal Scroll View 控件。
[0015]進(jìn)一步地,在復(fù)雜環(huán)境的外部控件對外部觸摸事件處理的情況下,開關(guān)的觸摸事件將與所述外部觸摸事件的處理產(chǎn)生沖突,而開關(guān)的觸摸事件無法得到執(zhí)行時(shí),要重寫dispatchTouchEvent (Mot1nEvent event)方法,在這個(gè)方法內(nèi)部調(diào)用 requestDisallowInterceptTouchEvent (true)方法,請求外部控件的父控件不要攔截開關(guān)的觸摸事件,讓開關(guān)類SuperButton自己處理發(fā)生的開關(guān)的觸摸事件;所述開關(guān)的觸摸事件包括:按下事件、移動事件或抬起事件。
[0016]本發(fā)明的優(yōu)點(diǎn)在于:本發(fā)明通過研究Android原生控件的實(shí)現(xiàn)原理,實(shí)現(xiàn)可以滑動點(diǎn)擊的自定義開關(guān),并針對目前常見的控件存在的問題,修改自定義開關(guān)的觸摸(Touch)事件的處理,使得控件能夠完美適用各種簡單或者復(fù)雜的應(yīng)用場景,不會出現(xiàn)卡頓甚至不能正常開關(guān)的情況。
【附圖說明】
[0017]圖1為本發(fā)明的方法流程示意圖。
[0018]圖2為本發(fā)明滑動的控制邏輯的流程示意圖。
[0019]圖3為本發(fā)明開關(guān)的觸摸事件將與所述外部觸摸事件的處理產(chǎn)生沖突情況下,滑動的控制邏輯的流程示意圖。
【具體實(shí)施方式】
[0020]請參閱圖1至圖3所示,本發(fā)明的一種基于復(fù)雜環(huán)境下實(shí)現(xiàn)開關(guān)可滑動可點(diǎn)擊的方法,所述方法包括如下步驟:
[0021]步驟1、在復(fù)雜環(huán)境下創(chuàng)建一開關(guān)類SuperButton,獲得該開關(guān)類SuperButton的背景圖片所占的大小作為一開關(guān)視圖的大小,并將該開關(guān)視圖繪制到屏幕上;所述步驟1具體為:創(chuàng)建一開關(guān)類SuperButton,所述開關(guān)類SuperButton繼承開關(guān)控件的父類View,通過構(gòu)造方法創(chuàng)建開關(guān)對象,調(diào)用0nMeaSUre(int,int)方法測量開關(guān)對象的背景圖片所占的大小作為開關(guān)視圖的大小,并調(diào)用onDraw (canvas)方法將該開關(guān)視圖繪制到屏幕上。所述復(fù)雜環(huán)境包括:滑動類及滾動類的視圖控件,繼承自容器類的控件ViewGroup的自定義控件,或者原生控件的環(huán)境下;所述滑動類及滾動類的視圖控件包括ViewPager控件、ListView 控件、ScrollView 控件、Horizontal Scroll View 控件。
[0022]步驟2、開關(guān)視圖顯示后,對開關(guān)視圖加入點(diǎn)擊和滑動的控制邏輯;
[0023]所述點(diǎn)擊的控制邏輯為:通過重寫onClick(view)方法控制點(diǎn)擊事件,設(shè)定一個(gè)表示開關(guān)狀態(tài)的變量,根據(jù)該變量的值來改變滑動開關(guān)的位置,并刷新屏幕的界面;這樣就實(shí)現(xiàn)了點(diǎn)擊改變開關(guān)狀態(tài)。
[0024]所述步驟2中根據(jù)該變量的值來改變滑動開關(guān)的位置,具體為:所述變量為布爾類型,變量初始值設(shè)置為true,表不開的狀態(tài),當(dāng)發(fā)生點(diǎn)擊事件后,將變量的值改為false,再點(diǎn)擊時(shí),將變量的值改為true,以此類推;改變變量的值后,要同時(shí)修改開關(guān)滑塊距離界面左邊界的值;其中,本實(shí)施例中,開關(guān)開的時(shí)候開關(guān)滑塊距離界面左邊界的值為開關(guān)視圖的長度減去開關(guān)滑塊的長度,開關(guān)關(guān)的時(shí)候開關(guān)滑塊距離