1

我有一項活動正在評估對參考軌道實時演唱的人。我想要的是,當用戶點擊練習按鈕時,在屏幕上倒計時5秒鐘,屏幕上的所有組件都將停用。我也想在屏幕上顯示倒計時。這個想法是在我的Activity視圖頂部有一個透明的灰色疊加層,並顯示倒計時。 我正在考慮在Android-SDK中執行AsyncTaskCountDownTimer的邏輯。什麼可以是實現這個可視化的最佳方式?實現覆蓋活動的倒數計時器

回答

1

我終於可以實現這一目標而無需使用CountDownTimer。爲了這個目的,我創建延伸的AsyncTask如下一類:

public class CountdownTask extends AsyncTask<Integer, Integer, Integer> { 

    private ICountdownView mCountdownView; 

    private static final String TAG = "CountdownTask"; 

    public CountdownTask(ICountdownView countdownView) { 
     this.mCountdownView = countdownView; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // Code to set up the timer ... 
     mCountdownView.initCountdownView(); 

    } 

    @Override 
    protected Integer doInBackground(Integer... params) { 
     // setting the default number of steps .. 
     int countdownSteps = 5; 
     // reading the number of steps if mentioned in the parameters 
     if (params.length >= 1 && params[0] != null) { 
      countdownSteps = params[0]; 
     } 

     // setting the default step duration in milliseconds .. 
     int stepDur = 1000; 
     // reading the step duration if mentioned in the parameters 
     if (params.length >= 2 && params[1] != null) { 
      stepDur = params[1]; 
     } 

     for (int i = 0; i < countdownSteps; i++) { 
      publishProgress(countdownSteps - i); 
      sleep(stepDur); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     mCountdownView.updateCountdownView(values[0]); 
    } 

    @Override 
    protected void onPostExecute(Integer integer) { 
     super.onPostExecute(integer); 
     mCountdownView.destroyCountDownView(); 
    } 

    private void sleep(int mDelay) { 
     try { 
      Thread.sleep(mDelay); 
     } catch (InterruptedException e) { 
      Log.e(TAG, e.toString()); 
     } 
    } 
} 

用於更新到用戶界面中,我已經創建了一個接口ICountdownView。無論哪種活動都希望倒計時需要實現此接口,然後使用new CountdownTask(this)初始化CountdownTask,其中this引用活動類的引用。接口ICountdownView如下:

public interface ICountdownView { 

    void initCountdownView(); 

    void updateCountdownView(int timeLeft); 

    void destroyCountDownView(); 
} 

在您的活動,您將實現所有這些方法,通過任何你想要的動畫。在我的情況下,在initCountdownView(),我初始化一個透明背景,沒有標題的對話框。在每個updateCountdownView(int timeLeft)上,我都會顯示對話框中的剩餘時間並對其進行動畫處理。在destroyCountDownView(),我dismiss()對話框,並繼續我需要做的下一步。希望這可以幫助!

PS:

mCountdownTask.execute(5, 1000); 

這上面的語句使得倒計時在5個步驟每個步驟爲1000來執行:可以用的步驟的數量並且在像毫秒提到的每個步驟的持續時間發起CountdownTask毫秒(1秒)。如果用戶沒有提供任何參數,這也是CountdownTask的默認行爲。

+0

好邏輯bro .. + 1 –

0

CountDownTimer,因爲它提供了即用的滴答作響的功能:

new CountDownTimer (5000, 1000) { 
    @Override 
    public void onTick(long millisUntilFinished) { 
    countDownView.setText((int)(millisUntilFinished/1000) + "sec left"); 
    } 

    @Override 
    public void onFinish() { 
    overlay.setVisibility(GONE); 
    } 
}.start() 
+0

我很清楚這個部分。我想問的是如何實現視圖。目前,我正在使用帶有透明背景的'PopupWIndow'作爲我的活動。我在'AsyncTask'的'doInBackground()'方法內實現'CountDownTimer'。我選擇這樣做是因爲我想從主Activity中分離出這個邏輯,並在其他地方重複使用倒計時器的相同實現。現在我得到的問題是,它向我展示了一個運行時異常'由於:java.lang.RuntimeException:無法在未調用Looper.prepare()'的線程內創建處理程序。 – Swapnil

+0

我不會在AT中啓動一個CDT,因爲它們都在線程中運行,所以會導致一定的開銷。然後你必須照顧UI線程:在AsyncTask中,只能在'onPre/PostProcess()'方法中影響主線程。另一方面,你可以通過將覆蓋視圖作爲構造函數參數傳遞給它來生成CDT實現。 – injecteer

+0

是的。謝謝你的提示。這有幫助! – Swapnil