本發(fā)明涉及顯示技術(shù)領(lǐng)域,具體地說,本發(fā)明涉及一種用于電紙墨水屏幕的顯示方法。
背景技術(shù):
電紙墨水(即Eink,也可稱為電子墨水)是融合化學(xué)、物理和電子學(xué)而產(chǎn)生的一種新材料技術(shù),目前,Eink技術(shù)已被廣泛運用于電紙書閱讀器、顯示牌、雙屏手機(jī)等領(lǐng)域。行業(yè)內(nèi)通常將Eink屏幕稱為電子紙,電子紙的反射率高于常用的反射式lcd,更接近報紙水平,因此它相對于傳統(tǒng)的lcd顯示屏具有護(hù)眼的效果。同時,電子紙具有資料保存性,只有畫面更新時才耗電,電源關(guān)閉后信息仍可留存在監(jiān)視器上,因此電子紙還具有功耗低的優(yōu)勢。然而,正是因為電子紙的資料保存性特點,在長時間使用后,電子紙上容易出現(xiàn)殘影和字跡模糊等問題,這會嚴(yán)重影響用戶使用體驗。
現(xiàn)有的電子紙設(shè)備(例如電紙書閱讀器)中,通常會在每次或者每幾次頁面刷新時自動對屏幕進(jìn)行初始化,以解決殘影和字跡不清晰的問題,然而屏幕初始化會在視覺上造成黑色閃爍現(xiàn)象,頻繁地初始化操作會使得屏幕閃爍問題嚴(yán)重,導(dǎo)致用戶的使用體驗不佳。這個問題在現(xiàn)有的電紙書閱讀器上尤其明顯。
因此,當(dāng)前迫切需要一種能夠克服上述缺陷的用于Eink屏幕的顯示解決方案。
技術(shù)實現(xiàn)要素:
因此,本發(fā)明的任務(wù)是克服現(xiàn)有技術(shù)的缺陷,提供一種用于Eink屏幕的顯示解決方案。
根據(jù)本發(fā)明的一個方面,提供了一種用于電紙墨水屏幕的顯示方法,其中,使用GLSurfaceView類型的視圖來顯示頁面,所述顯示方法包括下列步驟:
1)識別觸發(fā)頁面發(fā)生變化的操作指令,獲取所要顯示的下一頁面的 內(nèi)容;
2)獲取當(dāng)前視圖的控制權(quán);
3)在當(dāng)前視圖的畫板上繪制白色,然后觸發(fā)顯示芯片將當(dāng)前視圖投射到頻幕;
4)將所述的所要顯示的下一頁面的內(nèi)容繪制到與當(dāng)前視圖所對應(yīng)的頁面圖像數(shù)據(jù)文件中;
5)用步驟4)所得的頁面圖像數(shù)據(jù)文件來填充當(dāng)前視圖的畫板;
6)觸發(fā)顯示芯片將當(dāng)前視圖渲染到頻幕上。
其中,所述步驟1)中,可識別的所述操作指令包括:觸發(fā)頁面發(fā)生變化的用戶操作指令和內(nèi)部操作指令。
其中,所述步驟1)中,所述用戶操作指令包括:翻頁指令、觸發(fā)頁面編輯的指令、從目錄頁打開圖書的指令、從一個目錄頁跳轉(zhuǎn)到另一個目錄頁的指令以及從圖書頁面返回目錄頁的指令中的一個或多個。
其中,所述步驟1)還包括:當(dāng)識別出所述操作指令是翻頁操作指令時,所述所要顯示的下一頁面的內(nèi)容包括:下一頁面的文本內(nèi)容。
其中,所述步驟1)還包括:當(dāng)識別出所述操作指令是觸發(fā)頁面編輯的指令時,識別出當(dāng)前所選擇的被編輯區(qū)域的坐標(biāo)。
其中,所述步驟1)中,所述所要顯示的下一頁面的內(nèi)容包括:位于所選擇的被編輯文字下方的空白區(qū)域處的標(biāo)記符號。
其中,所述步驟4)還包括:根據(jù)被編輯區(qū)域的坐標(biāo)修改當(dāng)前視圖所對應(yīng)的頁面圖像數(shù)據(jù)文件,在所選擇的被編輯文字下方的空白區(qū)域處繪制標(biāo)記符號。
其中,所述步驟4)中,所述標(biāo)記符號為下劃線。
其中,所述步驟4)和步驟5)之間執(zhí)行步驟:
4a)檢測顯示芯片是否空閑,如果是,執(zhí)行步驟5),如果否,等待一段時間,然后重新執(zhí)行步驟4a)。
其中,所述步驟4)完成之后立即執(zhí)行所述步驟5)。
其中,所述步驟4)中,所述頁面圖像數(shù)據(jù)文件包括預(yù)先劃分的多個分區(qū)。
其中,所述步驟4)還包括:僅對所述頁面圖像數(shù)據(jù)文件中的部分分區(qū)進(jìn)行修改,所述部分分區(qū)是所要顯示的下一頁面的內(nèi)容相對于接收所述操作指令的當(dāng)前頁面發(fā)生變化的分區(qū)。
其中,所述步驟4)中,所述頁面圖像數(shù)據(jù)文件的分區(qū)包括:正文區(qū)、頁眉區(qū)和頁腳區(qū)。
其中,所述步驟4)中,所述頁面圖像數(shù)據(jù)文件的分區(qū)還包括:頁邊區(qū)。
其中,所述步驟2)還包括:在獲取當(dāng)前視圖的控制權(quán)后,鎖定當(dāng)前視圖的畫板。
其中,所述步驟5)還包括:當(dāng)前視圖的畫板填充完畢后,解鎖當(dāng)前視圖的畫板。
其中,所述步驟3)中,觸發(fā)顯示芯片通過GL16+FULL模式將當(dāng)前視圖投射到頻幕。
其中,所述步驟6)中,觸發(fā)顯示芯片通過GC16+Partial模式將當(dāng)前視圖渲染到屏幕上。
其中,完成所述步驟2)后,同時執(zhí)行所述步驟3)和所述步驟4)。
與現(xiàn)有技術(shù)相比,本發(fā)明具有下列技術(shù)效果:
1、本發(fā)明能夠使Eink屏幕顯示的字跡清晰,沒有殘影。
2、本發(fā)明能夠避免Eink屏幕出現(xiàn)閃爍現(xiàn)象,從而提升用戶體驗。
3、本發(fā)明能夠提高Eink屏幕的響應(yīng)速度。
附圖說明
以下,結(jié)合附圖來詳細(xì)說明本發(fā)明的實施例,其中:
圖1示出了現(xiàn)有技術(shù)中一種典型的電紙書閱讀器在翻頁時的顯示機(jī)制的流程圖;
圖2示出了本發(fā)明一個實施例的電紙書閱讀器在翻頁時的顯示機(jī)制的流程圖;
圖3示出了本發(fā)明一個實施例的電紙書閱讀器在頁面編輯過程的顯示機(jī)制的流程圖。
具體實施方式
發(fā)明人對現(xiàn)有技術(shù)中的電紙書閱讀器做了深入研究,發(fā)現(xiàn)其固有的顯示機(jī)制是造成屏幕閃爍現(xiàn)象的主要原因,因此有針對性地提出了一種用于Eink屏幕的顯示方法,它能夠廣泛地應(yīng)用于基于Eink屏幕的設(shè)備中。
為了便于理解,下面首先介紹現(xiàn)有技術(shù)中典型的Eink屏幕的顯示機(jī) 制并分析其屏幕閃爍問題的原因。圖1示出了現(xiàn)有技術(shù)中一種典型的電紙書閱讀器在翻頁時的顯示機(jī)制的流程圖,該顯示機(jī)制包括下列步驟:
步驟101:使用View方式打開圖書。
步驟102:屏幕接收到用戶的觸發(fā)翻頁的指令。
步驟103:操作系統(tǒng)讀取下一頁的文本內(nèi)容。
步驟104:調(diào)用系統(tǒng)函數(shù)invalidate()啟動當(dāng)前頁的View(即當(dāng)前頁的視圖)的自動圖片繪制。
步驟105:基于所讀取的下一頁文本內(nèi)容,調(diào)用系統(tǒng)中的draw(Canvas canvas)函數(shù),在View的畫板上繪制新的圖片。系統(tǒng)中的draw(Canvas canvas)函數(shù)能夠基于View的類型將文本轉(zhuǎn)換為相應(yīng)的圖片。也就是說,調(diào)用系統(tǒng)中的draw(Canvas canvas)函數(shù)后,View的畫板上將繪制新的一頁的文本所對應(yīng)的圖片。
步驟106:操作系統(tǒng)通過顯示芯片將View投射到屏幕上,這樣就完成了翻頁所觸發(fā)的屏幕變化。
然而,系統(tǒng)中的draw(Canvas canvas)函數(shù)有其固有的運行機(jī)制,這個運行機(jī)制可能會觸發(fā)整個屏幕初始化。初始化會對屏幕所有像素均勻地填充電子墨水,這就導(dǎo)致了在視覺上產(chǎn)生黑色閃爍現(xiàn)象。這種閃爍現(xiàn)象可能在每次翻頁時都會出現(xiàn),也可能是在每數(shù)次翻頁后出現(xiàn),也可能是系統(tǒng)檢測到一定程度的殘影后出現(xiàn)。但無論哪種情況,都會嚴(yán)重影響用戶體驗。并且,某些情形下,例如當(dāng)前頁面為目錄頁時,頁面上包括多個元素,它們樹狀結(jié)構(gòu)體的形式存儲,而整個屏幕初始化需要對樹狀結(jié)構(gòu)體從葉節(jié)點到根節(jié)點進(jìn)行遍歷,使每個元素都進(jìn)行初始化。這種情況下,由于需要初始化多個節(jié)點,所以可能會導(dǎo)致黑屏的時間延長,使閃爍問題更加明顯,同時還使響應(yīng)時間延長。
下面結(jié)合附圖和實施例介紹本發(fā)明所提出的能夠避免屏幕閃爍現(xiàn)象的顯示機(jī)制。
圖2示出了本發(fā)明一個實施例的電紙書閱讀器在翻頁時的顯示機(jī)制的流程圖,包括下列步驟:
步驟201:使用GLSurfaceView非阻塞方式打開圖書。GLSurfaceView是一種異步的視圖(View)類型,使用GLSurfaceView非阻塞方式打開圖書后,圖書內(nèi)容被繪制在GLSurfaceView類型的View的畫板上,而圖書 頁面在屏幕上的顯示就是通過將這種異步的View投射到屏幕上來實現(xiàn)。
步驟202:操作系統(tǒng)(也可以是應(yīng)用,例如閱讀應(yīng)用,下文對此不再贅述)識別用戶輸入的操作指令,當(dāng)識別出所接收到的是用戶的觸發(fā)翻頁的指令時,操作系統(tǒng)通過調(diào)用requestRender()函數(shù)請求獲取當(dāng)前View的控制權(quán),啟動下一頁內(nèi)容的圖片繪制。
本實施例中重構(gòu)的requestRender()函數(shù)執(zhí)行偽代碼如下:
調(diào)用requestRender()函數(shù)后,同時開始執(zhí)行步驟203和步驟205。需要說明的是,由于本實施例中使用GLSurfaceView非阻塞方式打開圖書,因此當(dāng)前View的類型是GLSurfaceView。
步驟203:通過Canvas canvas=SurfaceHolder.lockCancas()命令,鎖定當(dāng)前View的畫板。由于本實施例中View為GLSurfaceView類型,具有非阻塞異步運行的特點,本步驟的作用是防止當(dāng)前View的畫板被無關(guān)應(yīng)用使用。
步驟204:通過Canvas.drawColor(0xFFFFFF)命令,在當(dāng)前View的畫板上繪制白色,操作系統(tǒng)通過顯示芯片將當(dāng)前的View投射到屏幕上,這樣屏幕就會被刷白,上一頁的電子墨水被抹去且不留殘影。步驟204完成后,跳轉(zhuǎn)至步驟206。本步驟中,采用顯示芯片的GL16+FULL模式來實現(xiàn)屏幕刷新。GC16+FULL是指:基于GC16機(jī)制更新整個顯示屏圖像,將所要顯示圖像全部更新到屏幕上的屏幕刷新模式。其中GC16代表16級灰度結(jié)算(區(qū))波形。
步驟205:讀取下一頁的文本內(nèi)容,將所展示的文字繪制在一個圖像數(shù)據(jù)文件上,本實施例中圖像數(shù)據(jù)文件為Bitmap,Bitmap是二進(jìn)制文件,它由每個像素點所對應(yīng)的灰度值構(gòu)成。
一個實施例中,將文本內(nèi)容繪制在Bitmap的偽代碼如下:
Rect rect=new
Rect(area.mLeft,area.mTop,area.mRight,area.mTop+area.mBarHeightT);
mTextPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
canvas.drawRect(rect,mTextPaint);
步驟204和步驟205均執(zhí)行完后,執(zhí)行步驟206。
步驟206:直接讀取步驟205所繪制的Bitmap來填充當(dāng)前View的畫板。
步驟207:通過SurfaceHolder.unlocakCanvasAndPost(canvas)命令,解鎖當(dāng)前GLSurfaceView的畫板。
步驟208:操作系統(tǒng)將當(dāng)前的View渲染到屏幕上。本步驟中,通過顯示芯片的GC16+Partial刷新模式將當(dāng)前View顯示到屏幕上。GC16+Partial是指:基于GC16機(jī)制將部分需要更新的圖像顯示到顯示屏上屏的屏幕刷新模式。其中GC16代表16級灰度結(jié)算(區(qū))波形。
上述實施例的電紙書閱讀器的顯示機(jī)制避免了調(diào)用系統(tǒng)函數(shù)draw(Canvas canvas),所以在翻頁過程中不會觸發(fā)屏幕初始化機(jī)制,從而避免了閃爍現(xiàn)象。在實際測試時,在應(yīng)用上述流程實現(xiàn)翻頁的電紙書閱讀器上,未發(fā)現(xiàn)閃爍現(xiàn)象,并且屏幕上沒有殘影,字跡清晰。另外,由于步驟204和步驟205同時執(zhí)行,屏幕刷白幾乎不會消耗額外的時間,因此上述實施例的電紙書閱讀器的顯示機(jī)制還具有響應(yīng)速度快的優(yōu)勢。
進(jìn)一步地,在一個實施例中,對Bitmap進(jìn)行分區(qū),分區(qū)包括:正文區(qū)、頁眉區(qū)、頁腳區(qū)和頁邊區(qū)。在前文所述步驟205中,只需要將所讀取的下一頁的文本內(nèi)容繪制在Bitmap的正文區(qū)即可。而頁眉區(qū)可專用于顯示動態(tài)或靜態(tài)的常用信息,例如時間,天氣等。頁腳區(qū)可用于顯示頁碼,在翻頁時或者翻頁完成后,修改Bitmap中頁腳區(qū)即可顯示新的頁碼。頁邊區(qū)可用于制作翻頁動畫效果。進(jìn)一步地,在另一個實施例中,如果頁眉區(qū)顯示的是動態(tài)常用信息,例如時間,那么在每次對該動態(tài)信息進(jìn)行刷新時,操作系統(tǒng)會發(fā)出刷新時間的內(nèi)部操作指令,這種情況下,顯示流程與上述步驟201至207基本一致,不同之處僅在于:步驟202中識別出所接收指令為刷新時間的內(nèi)部操作指令,步驟205中僅修改Bitmap的頁眉區(qū),其它分區(qū)均不變。
另一方面,除了翻頁操作外,有時用戶需要對書籍頁面進(jìn)行編輯。在進(jìn)行編輯時,用戶需要通過觸摸操作選擇被編輯區(qū)域,而這個被編輯區(qū)域應(yīng)當(dāng)實時地反饋到屏幕上,以便用戶操作。在典型的現(xiàn)有技術(shù)中,通常需要在原有的View上覆蓋一個透明的View,在透明的View上通過調(diào)用draw(Canvas canvas)函數(shù)來繪制標(biāo)記符從而實時顯示用戶所選擇的被編輯區(qū)域,待用戶選定被編輯區(qū)域后,再合并兩個View,而合并過程中需要再次調(diào)用draw(Canvas canvas)函數(shù)來繪制合并后的畫面。這種方案顯然也會帶來屏幕閃爍的問題,同時還存在響應(yīng)速度慢的問題,這些問題都嚴(yán)重影響用戶體驗。
基于此,根據(jù)本發(fā)明的另一個實施例,提供了一種電紙書閱讀器在頁面編輯過程的顯示機(jī)制,圖3示出了該實施例的顯示機(jī)制的流程圖,包括下列步驟:
步驟301:使用GLSurfaceView非阻塞方式打開圖書。
步驟302:操作系統(tǒng)識別用戶輸入的操作指令,當(dāng)識別出屏幕接收到用戶指令是觸發(fā)頁面編輯的指令時,識別被編輯區(qū)域的坐標(biāo),然后通過requestRender()請求繪制。本實施例中,被編輯區(qū)域通常是指被選定的待編輯文字下方的空白區(qū)域。
步驟303:通過Canvas canvas=SurfaceHolder.lockCancas()命令,鎖定當(dāng)前View的畫板。
步驟304:通過Canvas.drawColor(0xFFFFFF)命令在當(dāng)前View的畫板上繪制白色,然后采用顯示芯片的GL16+FULL模式將屏幕填白,實現(xiàn)防殘影功能。
步驟305:修改當(dāng)前View的畫板對應(yīng)的Bitmap,在被編輯區(qū)域?qū)?yīng)的位置處繪制下劃線,這個繪制通過修改Bitmap中被編輯區(qū)域相應(yīng)坐標(biāo)處的灰度值實現(xiàn)。需要說明的是,下劃線只是顯示被編輯區(qū)域的方式之一,在別的實施例中,也可以通過在待編輯文字下方空白處繪制其它符號來突出顯示被編輯區(qū)域。
步驟304和步驟305均執(zhí)行完后,執(zhí)行步驟306。
步驟306:直接讀取步驟305修改后的Bitmap來填充當(dāng)前View的畫板。
步驟307:通過Holder.unlocakCanvasAndPost(canvas)命令,解鎖當(dāng)前 View的畫板。
步驟308:操作系統(tǒng)將View投射到屏幕上。本步驟中,通過顯示芯片的GC16+Partial模式將View投射到屏幕上。
在一個實施例中,上述步驟303至307可以通過重構(gòu)的requestRender函數(shù)實現(xiàn),這樣在調(diào)用requestRender函數(shù)后,就會直接執(zhí)行步驟303至307所對應(yīng)的代碼。在一個例子中,重構(gòu)GLSurfaceView的requestRender函數(shù)的偽代碼如下:
更進(jìn)一步地,除了翻頁操作和編輯操作以外,電紙書閱讀器可能還會接收到其它類型的觸發(fā)頁面發(fā)生變化的用戶操作指令,例如:從目錄頁打開圖書的指令、從一個目錄頁跳轉(zhuǎn)到另一個目錄頁的指令(包括進(jìn)入下一級目錄的指令,返回上一級目錄的指令)、從圖書頁面返回目錄頁的指令中。這些用戶操作指令同樣可以識別并基于本發(fā)明的顯示方法進(jìn)行顯示,從而解決殘影、閃爍等問題,并保持較快的響應(yīng)速度。具體的顯示流程與前文步驟201至步驟208的基本一致,僅步驟202和步驟205中的所要顯示的下一頁面的內(nèi)容存在不同。因此,僅需在步驟202中,根據(jù)所識別出的指令類型,獲取相應(yīng)的所要顯示的下一頁面的內(nèi)容即可。例如,在指令類型為翻頁指令時,讀取下一頁面的文本內(nèi)容;在指令類型為觸發(fā)編輯操作的指令時,識別被編輯區(qū)域,在被編輯區(qū)域生成標(biāo)記符號(例如下劃線);在指令類型為返回上一級目錄的指令,則讀取上一級目錄的頁面所對應(yīng)的 樹狀結(jié)構(gòu)體,該樹狀結(jié)構(gòu)體的葉節(jié)點元素對應(yīng)于書籍圖標(biāo)或者子目錄圖標(biāo)。
另外,在執(zhí)行步驟206之前,可以檢測當(dāng)前顯示芯片是否空閑,以確保顯示芯片已完成刷白頻幕的任務(wù)。例如,在一個實施例中,在執(zhí)行步驟206之前,檢測當(dāng)前顯示芯片是否空閑,如果是,則執(zhí)行步驟206,如果否,則等待一個預(yù)設(shè)的時間周期,然后再次檢測當(dāng)前顯示芯片是否空閑,直至當(dāng)前顯示芯片空閑。這種方案能夠確保頻幕上不留殘影,使得頁面清晰。需要說明的是,本發(fā)明也可以不檢測芯片是否空閑,例如在另一個實施例中,在步驟204和步驟205完成后立即進(jìn)入步驟206,由于GC16+FULL刷新模式刷白通常耗時較少,因此在大部分情況下該實施例的顯示機(jī)制也不會在頻幕上留有殘影,同時消除屏幕閃爍的問題,因此該實施例相對于現(xiàn)有的顯示機(jī)制也能夠在一定程度上改善用戶體驗。
最后應(yīng)說明的是,以上實施例僅用以描述本發(fā)明的技術(shù)方案而不是對本技術(shù)方法進(jìn)行限制,本發(fā)明在應(yīng)用上可以延伸為其它的修改、變化、應(yīng)用和實施例,并且因此認(rèn)為所有這樣的修改、變化、應(yīng)用、實施例都在本發(fā)明的精神和教導(dǎo)范圍內(nèi)。