看電影的時(shí)候,想必大家經(jīng)常會(huì)在電影開(kāi)場(chǎng)的時(shí)候看見(jiàn)一段故事梗概的介紹,其中有一種顯示的效果是一個(gè)字一個(gè)字先后順序出現(xiàn)在屏幕上的,并且每出現(xiàn)一個(gè)字,還有一個(gè)鍵盤(pán)打字的聲音出現(xiàn)。這個(gè)在android上面怎么做呢?
最近做的一個(gè)游戲,用到了這個(gè)效果,我是這樣做的。
首先,重寫(xiě)了一個(gè)SurfaceView。在這個(gè)SurfaceView里面去顯示我的這段故事梗概的文字。那如何去實(shí)現(xiàn)按照順序一個(gè)字一個(gè)字顯示出來(lái)呢?Thread 首當(dāng)其沖想到的就是他了。
開(kāi)一個(gè)線程去做這個(gè)事情,每顯示一個(gè)字,就讓線程sleep一下,然后再顯示一個(gè)字,最后直到顯示了所有的字。這個(gè)時(shí)候就釋放這個(gè)線程。
那具體怎么做呢?下面一步一步來(lái):(由于代碼太多,我只貼重要的核心代碼)
第一步:
重寫(xiě)一個(gè)自己的Thread 命名為MyThread。
MyThread 的run方法實(shí)現(xiàn):
public void run() {
while(my_thread_runing){ // 這里my_thread_runing 是一個(gè)boolean變量,用 //于控制線程是否運(yùn)行
if(play_text_all_nums > play_text_nums && holder != null)
{//play_text_all_nums 代表所有顯示字的數(shù)量。play_text_nums 代表 //當(dāng)前顯示的字?jǐn)?shù)
get_the_main_explain_currtext(); //計(jì)算出當(dāng)前顯示的那些字
Draw_the_main_explain_text(holder);//顯示出這些字
synchronized (this) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
else
{//否則停止線程
my_thread_runing = false;
first_into = false;
if(my_thread != null) my_thread.interrupt();
}
}
}
第二步:解釋則個(gè)函數(shù)的實(shí)現(xiàn)get_the_main_explain_currtext(); //計(jì)算出當(dāng)前顯示的那些字
首先:由字符串ID取出所有的字(這里這個(gè)字符串有一個(gè)特點(diǎn):字與字間有一個(gè)空格),然后計(jì)算出一個(gè)有多少個(gè)字play_text_all_nums
然后:每一次取出需要顯示的字裝載到一個(gè)新的字符串變量里面String str_text_curr;
OK。這樣就實(shí)現(xiàn)了。下面問(wèn)題來(lái)了。當(dāng)正在一個(gè)個(gè)顯示字的時(shí)候,按home按鍵退出,然后在進(jìn)入這個(gè)應(yīng)用時(shí)候!可能出現(xiàn)一個(gè)問(wèn)題:那就是 MyThread這個(gè)線程跑不起來(lái)。
因?yàn)檫@一次進(jìn)入 MyThread根本沒(méi)有start。當(dāng)然,這里不是討論為什么出現(xiàn)這個(gè)問(wèn)題。而是想說(shuō)home按鍵。網(wǎng)上有大量的人詢(xún)問(wèn)如何屏蔽home按鍵這個(gè)時(shí)間。其實(shí)google是沒(méi)有開(kāi)放home按鍵事件,也就是這個(gè)按鈕的事件消息不會(huì)上傳到APP通知我們的。既然google沒(méi)有開(kāi)放,我認(rèn)為大家還是不要這么去做,畢竟google這么去做事有他的優(yōu)點(diǎn)的,前不久,我去網(wǎng)上下了一個(gè)應(yīng)用,結(jié)果這個(gè)應(yīng)用跑起來(lái)非常慢,我按返回按鍵沒(méi)有反應(yīng),結(jié)果是我狂試了所有能按的按鍵和觸摸屏,就是退不出來(lái),唯一的辦法就把手機(jī)的電池給拿掉,從新開(kāi)機(jī)。在這里我非常希望大家不要去把原本好好的android系統(tǒng)給搞亂了。
那你說(shuō),我要解決問(wèn)題怎么辦,你又要我不要亂改系統(tǒng)原來(lái)的設(shè)計(jì)。我覺(jué)得辦法很多,只要你想一定可以搞定的。 看看上面的代碼,我還加了這個(gè)Boolean變量first_into = false; 用他也是可以解決問(wèn)題的!