我有一项活动正在评估与参考曲目实时演唱的人。我想要的是当用户点击练习按钮时,屏幕上会倒计时5秒钟,屏幕上的所有组件都会停用。我还想在屏幕上显示倒计时。我的想法是在Activity
视图顶部显示透明的灰色叠加层,并显示倒计时。
我正在考虑在Android-SDK中使用AsyncTask
和CountDownTimer
来实现逻辑。什么是实现可视化的最佳方法?
答案 0 :(得分: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());
}
}
}
为了更新到UI,我创建了一个接口ICountdownView
。无论哪个活动需要倒计时,都需要实现此界面,然后使用CountdownTask
初始化new CountdownTask(this)
,其中this
指的是活动类的引用。接口ICountdownView
如下:
public interface ICountdownView {
void initCountdownView();
void updateCountdownView(int timeLeft);
void destroyCountDownView();
}
在您的活动中,您可以通过任何想要的动画实现所有这些方法。就我而言,在initCountdownView()
上,我初始化了一个透明背景而没有标题的对话框。在每个updateCountdownView(int timeLeft)
上,我会在对话框中显示剩余时间并为其设置动画。在destroyCountDownView()
上,我dismiss()
对话框,继续我接下来需要做的任何事情。希望这有帮助!
PS:您可以使用步数和每个步骤的持续时间(以毫秒为单位)启动CountdownTask
,如:
mCountdownTask.execute(5, 1000);
以上语句使倒计时以5个步骤执行,每个步骤的长度为1000毫秒(1秒)。如果用户没有提供任何参数,这也是CountdownTask
的默认行为。
答案 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()