張啟賢 成麗君 王堃
(山西農(nóng)業(yè)大學(xué) 山西省晉中市 030801)
當(dāng)今社會,手機(jī)已經(jīng)成為了人們生活中不可或缺的一部分,其強(qiáng)大的功能給我們帶來了極大的便利。從第一臺觸屏手機(jī)問世到現(xiàn)在已經(jīng)過去了許多年,移動互聯(lián)產(chǎn)業(yè)也發(fā)展得越來越成熟,手機(jī)經(jīng)歷了一代代技術(shù)革新,設(shè)計(jì)外觀和功能與以往相比有了很大不同,這其中必然會帶來許多新的問題待我們?nèi)ソ鉀Q,例如全面屏手機(jī)所帶來的問題。
隨著屏幕封裝技術(shù)的發(fā)展,特別是“COF”(Chip On Film)又稱覆晶薄膜封裝技術(shù)的發(fā)展,越來越多的手機(jī)開始走高屏占比路線。高屏占比極大地提升了手機(jī)的外觀以及顯示面積,且受到大多數(shù)消費(fèi)者的青睞,目前各大廠商都嘗到了甜頭,紛紛順應(yīng)趨勢發(fā)展,有些廠商甚至推出了“折疊屏”以及“曲面屏”產(chǎn)品。而“全面屏”是一種新興的手機(jī)設(shè)計(jì)理念,主要表現(xiàn)為手機(jī)正面的觸摸屏面積占比盡可能的大,達(dá)到近似于“手機(jī)正面全是屏幕”的效果。不同于以往手機(jī)正面頂部以及底部所擁有的碩大的非觸控面板,全面屏手機(jī)正面的可觸控區(qū)域非常大,用戶用手握持手機(jī)時,難免會無意間觸碰到屏幕部分,俗稱“誤觸”。誤觸的原因有很多,例如屏幕大、手勢豐富、反饋感不強(qiáng)等,但據(jù)相關(guān)研究顯示,屏幕大以及拇指活動范圍正是是造成誤觸的關(guān)鍵因素,尤其對于一些以娛樂、游戲?yàn)橹饕康挠脩魜碚f,屏幕誤觸會嚴(yán)重影響到其操作的準(zhǔn)確性以及觸摸的靈敏性,引起拖動失效等,造成交互問題。
目前,根據(jù)極光(Aurora Mobile,NASDAQ:JG)發(fā)布《2019年手機(jī)游戲行業(yè)研究報告》來看,我國手游用戶規(guī)模極大。據(jù)統(tǒng)計(jì),中國手游用戶 MAU ( monthly active users,指在線軟件的一個用戶數(shù)量統(tǒng)計(jì)名詞。)達(dá)8.25億,安裝滲透率達(dá)73.6%,人均每月游戲時長879分鐘[1]。據(jù)亞洲游戲市場數(shù)據(jù)分析機(jī)構(gòu)Niko Partners統(tǒng)計(jì),國內(nèi)手游產(chǎn)業(yè)發(fā)展迅速,PC網(wǎng)游的表現(xiàn)較2017年略有下降,不過手游方面的營業(yè)額則比之前上漲了28.9%,達(dá)到了1057億元人民,Niko預(yù)測,到2023年,中國的手游營業(yè)額將達(dá)到1725億元人民幣[2]。而據(jù)調(diào)查顯示,玩家群體中,95%的玩家會去玩手機(jī)游戲,僅有5%的玩家選擇不接觸手游。如圖1、圖2所示。
圖1:移動游戲市場預(yù)期|數(shù)據(jù)來源:Niko Partners
圖2:游戲玩家中接觸手游人數(shù)占比|數(shù)據(jù)來源:Niko Partners
圖3:全面屏手機(jī)誤觸圖示
可以看出,在游戲玩家群體中,有大約95%的人選擇使用手機(jī)玩游戲,且這一群體的規(guī)模以及投入還在逐漸增加。隨著5G的逐漸成熟,全面屏手機(jī)也會進(jìn)一步占據(jù)市場份額。可以預(yù)見,將會有更多的人利用全面屏或者曲面屏智能手機(jī)玩游戲。同時,越來越多的人在游戲娛樂時會發(fā)生屏幕誤觸問題,這會導(dǎo)致大批人擁有極差的手機(jī)游戲體驗(yàn),甚至影響手游產(chǎn)業(yè)以及手機(jī)口碑。因此,解決屏幕誤觸這一問題便顯得非常有實(shí)際意義。用戶握持全面屏手機(jī)時,拇指活動范圍內(nèi)難免會觸碰到屏幕邊緣造成誤觸,示意圖如圖3所示,其中紅色區(qū)域?yàn)檎`觸區(qū)域。
圖4:方案開啟屏幕死區(qū)流程圖
為解決誤觸問題,那么我們可否嘗試把這一塊誤觸區(qū)域“廢掉”呢?我們來引入“屏幕死區(qū)”這一概念。
在以往看來,“死區(qū)”算是一種電子產(chǎn)品的硬件故障或者問題,在手機(jī)業(yè)界有定義:雖然手機(jī)屏幕的部分區(qū)域雖然可以正常顯示,但是觸摸卻沒反應(yīng),此部分區(qū)域便是屏幕死區(qū)。在平板電腦領(lǐng)域也有一些關(guān)于“死區(qū)”的說法,如果使用手寫筆在平板電腦屏幕上繪畫,手掌根部難免會壓在屏幕上,手指也可能參與繪畫,而無源手寫筆的筆頭為1到2mm,如果用戶手寫繪畫時能把手?jǐn)R在屏幕上,同時又保持足夠的速度和準(zhǔn)確度,確保接觸點(diǎn)剛好就是“墨水”的“著墨之處”,這樣才可以說滿足用戶使用需求??墒怯袝r對于一塊屏幕來說,手寫筆在屏幕傳感器中心位置的微小移動很難被檢測到,對于傳感器而言,輸入通常被量化到元件的中心,因此,當(dāng)手寫筆尖的移動僅位于單個傳感器元件微小的范圍內(nèi)時,會被報告為處于固定位置,這塊區(qū)域這就是所謂的“死區(qū)”(DeadZone),即使輸入刺激轉(zhuǎn)移到新位置時報告信號電平也不發(fā)生改變的區(qū)域[3]。雖說能識別手指觸摸,但是無法識別細(xì)微的筆尖移動,或者反之,能利用手寫筆繪畫,但手指無法與平板電腦交互,都會使產(chǎn)品達(dá)不到預(yù)想的功能要求。因此,該類設(shè)備還需要非常復(fù)雜的算法來識別不同的觸控事件。
但是“死區(qū)”對我們并不是百害而無一利,目前一些廠商針對全面屏手機(jī)誤觸問題所提出的解決方案正是巧妙利用“死區(qū)”這一概念。設(shè)置屏幕死區(qū)其實(shí)相當(dāng)于把屏幕一部分“廢掉”,使其不具備交互功能。例如,針對一些曲面屏手機(jī),將手機(jī)側(cè)面屏幕部分設(shè)置成死區(qū),即禁用該區(qū)域的觸摸事件,系統(tǒng)不對其作出反應(yīng);部分品牌手機(jī)的游戲中心自帶的屏幕死區(qū)功能,主要是通過設(shè)置觸控IC的參數(shù)來防止屏幕誤觸的;而我們接打電話時的“防誤觸模式”相當(dāng)于把整塊屏幕設(shè)置成了屏幕死區(qū),只不過是通過把整塊屏幕關(guān)掉來實(shí)現(xiàn)的。一些方案大多實(shí)現(xiàn)成本較高,設(shè)計(jì)參數(shù)設(shè)置復(fù)雜、靈活性較差、不方便隨時切換屏幕工作狀態(tài)、功能易受品牌限制。
表1:測試用例
本文將提出一種基于Android的屏幕死區(qū)生成方案,其創(chuàng)建流程如圖4所示。
本方案主要利用了Android系統(tǒng)服務(wù)生成懸浮窗原理來生成懸浮區(qū)域——“屏幕死區(qū)”。軟件操作界面如圖5所示。
懸浮窗是電腦或手機(jī)的系統(tǒng)工具,在其他應(yīng)用的表面懸浮、可移動的窗口,可以覆蓋于其他程序界面上層,不對其他正在運(yùn)行的程序造成一定影響,而且開啟靈活。對于Android操作系統(tǒng)來說,界面繪制主要是通過WindowManager(app與window通信的一種接口)的服務(wù)所實(shí)現(xiàn)的。它可以懸浮在已打開的手機(jī)應(yīng)用界面上,不擠占本來就不大的手機(jī)屏幕空間,能夠讓用戶在使用一個應(yīng)用程序同時完成其他工作。實(shí)現(xiàn)懸浮窗,我們就要利用WindowManager來“做手腳”。而創(chuàng)造一種獨(dú)立于其他應(yīng)用界面的屏幕死區(qū),則要在懸浮窗上“做手腳”。
WindowManager實(shí)現(xiàn)了ViewManager接口,可以通過獲取WINDOW_SERVICE系統(tǒng)服務(wù)得到[4]。而ViewManager接口有addView方法,我們就是通過這個方法將懸浮窗控件加入到屏幕中去,實(shí)現(xiàn)繪制。由于本方案具體實(shí)現(xiàn)方法主要在一個Service中,系統(tǒng)開啟本Service后,相當(dāng)于宣告屏幕死區(qū)的繪制完成,所以在最初,我們還應(yīng)判斷軟件是否開啟了繪制懸浮區(qū)域所需的系統(tǒng)權(quán)限,并根據(jù)系統(tǒng)版本進(jìn)行放權(quán)。
創(chuàng)建懸浮窗后,接下來我們要把懸浮窗變成屏幕死區(qū),是本方案的核心。首先獲取一個WindowManager服務(wù)對象,之后創(chuàng)建一個LayoutParams對象,這是一個參數(shù)包對象,繪制屏幕死區(qū)的所需參數(shù)都打包在這個對象中。由于本方案計(jì)劃支持?jǐn)?shù)據(jù)讀寫功能,方便用戶快速開啟所需的屏幕死區(qū),所以軟件應(yīng)設(shè)有數(shù)據(jù)庫系統(tǒng)。用戶可以將自定義的一組屏幕死區(qū)高度以及寬度數(shù)據(jù)存儲到數(shù)據(jù)庫中,每一組數(shù)據(jù)都擁有自身的id,在下次使用時,可根據(jù)id輕易讀出。而為了實(shí)現(xiàn)屏幕死區(qū)的核心特性——隔離用戶觸摸、不遮擋其他應(yīng)用程序,我們僅需對懸浮區(qū)域的布局參數(shù)做以下手腳:設(shè)置flags(FLAG_NOT_FOCUSABLE;)實(shí)現(xiàn)該區(qū)域不可聚焦,彈窗以外部分可以觸摸,設(shè)置params.format屬性為透明。LayoutParams參數(shù)包對象極大地方便了屏幕死區(qū)的參數(shù)設(shè)置,它原本是Android系統(tǒng)繪制懸浮區(qū)域的“助手”,卻幫助了我們對懸浮窗“改造”。我們可以將上述的死區(qū)大小參數(shù)以及用來設(shè)置屏幕死區(qū)特性的參數(shù)一并打包,在繪制懸浮區(qū)域的時候加進(jìn)去。
圖5:軟件操作界面
如何自定義大小,僅有參數(shù)的設(shè)置是不夠的,為繪制屏幕死區(qū),方案軟件主界面采用了谷歌現(xiàn)階段建議使用的ConstraintLayout布局方式,這種布局方式靈活,可以有效地解決布局嵌套過多的問題,相對位置度量清晰,我們可以將設(shè)置死區(qū)大小的控件、按鈕等在這個框架下嵌套、排版,實(shí)際運(yùn)行界面良好。
每一個Android工程創(chuàng)建都會默認(rèn)創(chuàng)建一個Activity(Activity是一個應(yīng)用程序組件,提供一個屏幕,用戶可以用來交互、完成某項(xiàng)任務(wù)),在該組件上引入設(shè)計(jì)好相關(guān)布局文件。其中該界面上該有有相應(yīng)的按鈕用于開啟Android Service并傳輸數(shù)據(jù)給Service,并綁定startService方法來開啟所創(chuàng)建的Service。Activity相當(dāng)于一個“啟動器”,而懸浮區(qū)域(屏幕死區(qū))擁有獨(dú)立的布局,并擁有單獨(dú)的關(guān)閉按鈕或者調(diào)節(jié)控件, 在其他程序中運(yùn)行時也可快捷方便地關(guān)閉、設(shè)置,與“啟動器”分開,不受其他布局影響。這樣,我們才可以實(shí)現(xiàn)屏幕死區(qū)在其他應(yīng)用程序界面之上也能夠順利地工作。
上述實(shí)現(xiàn)主要過程封裝在一個自定義方法——createtoucher方法中,其主要代碼如下所示:
輸入:
數(shù)據(jù)庫中存儲的屏幕死區(qū)數(shù)據(jù)id;
圖6:游戲軟件應(yīng)用測試圖
圖7:視頻類軟件應(yīng)用測試圖
對應(yīng)id的屏幕死區(qū)高度和寬度(ai,bj);
數(shù)據(jù)庫控制類Controller;
獲取屏幕長寬數(shù)據(jù)的方法getResources().getDisplayMetrics();
屏幕死區(qū)自身xml布局toucherlayout.
過程:
1:final Controller controller=new Controller(MyService.this);
2:定義查詢集final Cursor cursor=controller.query("0");
3:獲取一個WindowManager服務(wù)對象:windowManager = (WindowManager)getApplication().getSystemService(Context.WINDOW_SERVICE);
4:params = new WindowManager.LayoutParams();
5:IF (Build.VERSION.SDK_INT>=Build.VERSION_CODES.0_MR1)
6: params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
7:ELSE params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
8: params.format = PixelFormat.RGBA_8888;
9: params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
10:DisplayMetrics dm = getResources().getDisplayMetrics();
11:h1= dm.heightPixels,w1 = dm.widthPixels;
12:params.x = w1,params.y = h1;
13:WHILE cursor.moveToNext() DO
14: height1=cursor.getInt(ai);
15: width1=cursor.getInt(4);
16:params.width =width1;
17:params.height = height1;
18:獲取死區(qū)窗口xml布局;
輸出:windowManager.addView(toucherLayout, params);
測試方案主要測試了在屏幕底部左右生成的兩個屏幕死區(qū)。經(jīng)測試,所開啟的屏幕死區(qū)有效防止了握持時用戶手掌以及手指根部貼近屏幕邊緣所引起的誤操作。本方案設(shè)置死區(qū)關(guān)閉方式為雙擊綠色按鈕區(qū)域關(guān)閉,有效防止了用戶在其他應(yīng)用中操作時意外關(guān)閉已生成的屏幕死區(qū),經(jīng)測試,軟件邏輯設(shè)計(jì)效果良好。
測試項(xiàng)如表1所示。
本方案屏幕死區(qū)生成軟件可以應(yīng)用于各種場景,例如玩游戲時,在手機(jī)屏幕邊緣生成自定義大小的屏幕死區(qū),經(jīng)驗(yàn)證可以有效防止誤觸屏幕邊緣造成游戲內(nèi)誤操作,而且不遮擋游戲界面。還可以在用戶握持手機(jī)觀看視頻時,防止邊緣誤觸所導(dǎo)致的進(jìn)度條意外拖動或者拖動失敗,不遮擋視頻內(nèi)容,優(yōu)化全面屏手機(jī)用戶的視頻體驗(yàn)。應(yīng)用示意圖如圖6、圖7所示。
本文提出了基于Android懸浮窗創(chuàng)建可自定義區(qū)域大小的屏幕死區(qū)生成方案,通過詳盡的測試用例驗(yàn)證了方案的可行性,能夠解決手游用戶屏幕誤觸問題。該軟件不會對其他應(yīng)用程序造成影響,屬性設(shè)置簡單,開啟方便,占用內(nèi)存小。隨著5G的成熟應(yīng)用,高屏占比的手機(jī)市場的進(jìn)一步擴(kuò)大,該方案能夠?yàn)楦嗍褂萌嫫潦謾C(jī)的用戶處理屏幕誤觸方面提供實(shí)際幫助。但是,該軟件還需要在諸如適配性、界面美化、更自定義化等方面進(jìn)一步完善。