当前位置: 首页 > 知识库问答 >
问题:

ProgressBar导致对所有UI的常量onDraw调用

朱和惬
2023-03-14

我有一个带有ProgressBar的活动。这个栏用于显示游戏关卡上经过的时间。

我正在更新这个栏和一个带有倒数计时器的文本视图,每100ms调用一次。问题是,每次我调用 setProgress 时,它似乎都会导致一个无效的 (),使我的整个 UI 被重绘。如果我删除进度条更新的行,一切正常,甚至为文本视图设置文本显示剩余时间。

这对我来说是一个问题,因为我还有一个自定义视图,它只需要在我需要的时候重新绘制,或者至少重绘几次,但不是经常,因为它会影响性能。

这是我的一段代码

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();
    }
}

如何防止进度栏导致对 UI 的每个元素进行此绘制调用?

共有1个答案

卫彭亮
2023-03-14

根据AndroidSDK中的“源码/Android-18/小部件/进度条.java”,设置进程()的调用将导致调用无效()。

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()。在这种情况下似乎没有调用无效()。

 类似资料:
  • 问题内容: 根据python文档,自python 2.5开始支持相对导入和内部包引用。我当前正在运行Python 2.7.3。因此,我尝试在自己的程序包中实现此功能,以便将其用于更简单的导入。我很惊讶地发现它引发了SyntaxError异常,我希望有人可以帮助您找到原因。 我设置了一个测试目录进行测试: 两个__init__.py模块都为空。其他模块是: 当我尝试导入second_level模块时

  • 在阅读了后台服务限制之后,我注意到前台应用程序启动服务是安全的。因此,在我们的应用程序中,我们在片段的方法中调用了。我们认为这是可以的,因为在这个文档中,它说,当调用onStart时,片段对用户是可见的,当它是可见的,这意味着这个应用程序是一个前台应用程序。 但有时,我必须承认这种情况很少发生,我们仍然会收到以下例外情况 java.lang.IllegalStateException:不允许启动服

  • 问题内容: 我想要一个jQuery进度栏,该进度栏会根据服务器端请求的状态进行更新。我基于本教程编写此代码,但它使用文件上传器作为基础(与此问题相同)。没有文件上传器,我无法使其工作完全相同。问题是进度条仅在process.php完成后才更新。它等待整个过程完成,而不是异步请求进度更新。我只看到数据:数据警报一次。 有任何想法吗? 网页: Process.php-提交表单时调用 javascrip

  • 我试图以文本格式将简单的MNIST模型图导出到proto缓冲区文件。 实际上,我使用的是模块,但后来我决定切换,因为在keras序列模型中很难为输入和输出张量重命名/指定名称。 这是我的代码: 系统信息和图书馆信息 操作系统:Ubuntu 18.04 LTS 更多信息 正如我前面提到的,当我使用keras时,我可以很容易地按顺序导出keras,并且能够使用从

  • 我想让uiviews的alpha动画化,但我似乎做不到。它的行为怪异,并表示错误的运行UI更改不推荐在后台线程上运行,但我不知道如何使它运行在主线程上。谁能帮帮我吗?我相信它跳过了第一个uiview.animate块,并在没有任何动画的情况下执行第二个块中的内容。 函数animateSemaphore(){ }

  • 问题内容: 我正在构建一个UI,并且都是在XML中静态定义的。它的所有位置都具有重量,虽然看起来正确,但我想看到所有东西实际上都具有正确的高度。问题是,无论我在哪里为格式布局调用.getHeight(),都得到0。我在onCreate()和onStart()中都尝试过。一样。也会发生所有UI对象。任何想法? XML: 问题答案: 简而言之,视图尚未在onCreate(),onStart()或onR