我有一个有ProgressBar的活动。此栏用于显示游戏级别的已用时间。
我正在使用CountdownTimer更新此栏和TextView,每100ms调用一次。问题是,每次调用setProgress时,似乎都会导致invalidate()使我的整个UI重绘。如果我删除ProgressBar更新的行,一切正常,甚至是显示剩余时间的TextView的setText。
这对我来说是一个问题,因为我还有一个自定义视图,只有在需要时才需要重新绘制,或者至少几次但不是经常重绘,因为它会影响性能。
这是我的一段代码:
private CountDownTimer timer;
private long ttime;
private long ctime;
private ProgressBar bar;
private TextView clock;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
startTimer(500);
...
}
@Override
protected void onResume() {
super.onResume();
if(!checkFlags()){
startTimer(500);
}
}
@Override
protected void onPause() {
super.onPause();
if(!checkFlags()){
timer.cancel();
}
}
private void startTimer(long delay){
timer = new CountDownTimer(ctime,100){
public void onTick(long millisUntilFinished){
ctime = millisUntilFinished;
clock.setText(formatTime(millisUntilFinished));
bar.setProgress((int) (1000 - ((ctime * 1000)/ttime)));
}
public void onFinish(){
clock.setText("00:00");
gameOver(false);
}
};
if(delay > 0){
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
public void run(){
timer.start();
}
},delay);
}else{
timer.start();
}
}
如何阻止ProgressBar对UI的每个元素进行onDraw调用?
答案 0 :(得分:0)
根据Android SDK中的'sources / android-18 / android / widget / ProgressBar.java',setProgress()的调用将导致调用invalidate()。
private synchronized void doRefreshProgress(int id, int progress, boolean fromUser,
boolean callBackToApp) {
float scale = mMax > 0 ? (float) progress / (float) mMax : 0;
final Drawable d = mCurrentDrawable;
if (d != null) {
Drawable progressDrawable = null;
if (d instanceof LayerDrawable) {
progressDrawable = ((LayerDrawable) d).findDrawableByLayerId(id);
if (progressDrawable != null && canResolveLayoutDirection()) {
progressDrawable.setLayoutDirection(getLayoutDirection());
}
}
final int level = (int) (scale * MAX_LEVEL);
(progressDrawable != null ? progressDrawable : d).setLevel(level);
} else {
>>> invalidate();
}
if (callBackToApp && id == R.id.progress) {
onProgressRefresh(scale, fromUser);
}
}
尝试使用setProgressDrawable()。在这种情况下似乎没有调用invalidate()。