Android上內(nèi)置的Camera應(yīng)用程序缺少幾個基本功能,其中之一是在少量時間(例如10秒或30秒)之后照相的能力。此功能通常對于安裝了三角架的攝像頭非常有用。它能完成的一件事就是攝影師能夠建立一個場景,設(shè)置計時器,然后跑進(jìn)該場景。
雖然不會經(jīng)常這樣使用移動電話,但是它在某些情況下將會非常有用。例如,當(dāng)希望給自己和在一起的某個人照相時,我們會喜歡這個功能。目前,當(dāng)嘗試這么做時會遇到困難,此時我們看不到觸摸屏界面,因?yàn)樗c我們的臉部有一段距離。我們會在屏幕上到處亂點(diǎn),希望能夠按到拍照按鈕。
2.2.1 構(gòu)建基于定時器的Camera應(yīng)用程序
為了糾正剛才所描述的情況,可以在照相時添加一個時間延遲。接下來更新SnapShot示例,使得在按下按鈕10秒鐘后開始照相。
為了實(shí)現(xiàn)這個功能,需要使用一個類似java.util.Timer的對象。但是,在Android中使用Timer對象會導(dǎo)致一些問題,因?yàn)樗肓艘粋€單獨(dú)的線程。為了使得單獨(dú)的線程與UI交互,需要使用一個Handler對象在主線程中觸發(fā)一個動作。
使用Handler對象的另一個用途是安排在將來發(fā)生的操作。Handler對象所擁有的功能使得我們不必使用Timer對象。
為了創(chuàng)建在將來執(zhí)行某些動作的Handler對象,只須構(gòu)建一個通用的Handler對象:
Handler timerHandler = new Handler();
然后,必須創(chuàng)建一個Runnable對象,在其run方法中包含后面將要發(fā)生的動作。在當(dāng)前情況下,我們希望這個動作在10秒鐘之后發(fā)生,觸發(fā)照相操作:
Runnable timerTask = new Runnable() {
public void run() {
camera.takePicture(null,null,null,TimerSnapShot.this);
}
};
現(xiàn)在當(dāng)單擊一個按鈕時,只需要這樣安排操作:
timerHandler.postDelayed(timerTask, 10000);
這將通知timerHandler在10秒鐘(10000毫秒)之后調(diào)用timerTask方法。
下面的示例將創(chuàng)建一個Handler對象,并使它每秒鐘調(diào)用一個方法。通過采用這種方式,可以在屏幕上為用戶提供倒計時。