在android中的计时器1分钟后将背景颜色更改为红色

Posted

技术标签:

【中文标题】在android中的计时器1分钟后将背景颜色更改为红色【英文标题】:to change background color to red after 1 min of timer in android 【发布时间】:2016-04-20 18:44:09 【问题描述】:

我正在尝试在计时器 1 分钟后将背景颜色更改为红色,并且我想在 android 中的计时器 1 分钟 30 秒后将背景颜色更改为黄色。这是我正在尝试的代码,但它不起作用。

public void run() 
                timeInMilliseconds = SystemClock.uptimeMillis() - startTime;
                updatedTime = timeSwapBuff + timeInMilliseconds;
                int secs = (int) (updatedTime / 1000);
                int mins = secs / 60;
                secs = secs % 60;
                int milliseconds = (int) (updatedTime % 1000);
                timerValue.setText("" + mins + ":"

                        + String.format("%02d", secs) + ":"

                        + String.format("%03d", milliseconds));
                 if(mins==1)
                
                    View someView = findViewById(R.id.screen);
                    //View root = someView.getRootView();
                    someView.setBackgroundColor(Color.RED);
                
                customHandler.postDelayed(this, 0);

            

        ;

【问题讨论】:

【参考方案1】:

更简单

final View someView = findViewById(R.id.screen);
someView.postDelayed(new Runnable() 
   public void run() 
     someView.setBackgroundColor(Color.RED);
  

,TimeUnit.MINUTES.toMillis(1));

【讨论】:

【参考方案2】:

我认为您应该在 runOnUiThread 中处理 UI 视图。

if(mins==1)

    runOnUiThread(new Runnable() 
        @Override
           public void run() 
                View someView = findViewById(R.id.screen);
                //View root = someView.getRootView();
                someView.setBackgroundColor(Color.RED);
           
    );

【讨论】:

【参考方案3】:

试试这个:

private static final ScheduledExecutorService worker = 
  Executors.newSingleThreadScheduledExecutor();


Runnable task = new Runnable() 
    public void run() 
        View someView = findViewById(R.id.screen);
        someView.setBackgroundColor(Color.RED);
    
;
worker.schedule(task, 60, TimeUnit.SECONDS);

希望对你有帮助。

发件人: https://***.com/a/3072338/5778152

【讨论】:

@seemaDesai worker 在这里定义private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); 现在它没有显示任何错误,但背景颜色没有变为红色。 所以在 Ui 线程 runOnUiThread 上运行它来改变颜色【参考方案4】:

我前几次做过类似的事情。 首先进入你的布局(可以是RelativeLayout或其他):

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_ >

    <RelativeLayout
    android:id="@+id/screen"
    android:layout_
    android:layout_>

    //…what you want

   </RelativeLayour>

然后在你的活动中:

    //global variables
    private long addedTime;
    private Handler handler;
    private RelativeLayout screen;

 @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
    screen = (RelativeLayout) findViewById(R.id.screen);



    private void start()
        addedTime = 60;
        long changeTime = (Calendar.getInstance().getTimeInMillis()/1000) + addedTime;    
        handler = new Handler() 
            @SuppressWarnings("ResourceType")
            @Override
            public void handleMessage(Message msg) 
                if (addedTime == 60) 
                    screen.setBackgroundColor(Color.parseColor("#ff0000"));//red
                    addedTime = 120;
                else
                    screen.setBackgroundColor(Color.parseColor("#ffff00"));//yellow
                    addedTime = 60;

                
                changeTime = changeTime + addedTime;//add time for the new color change
                handler.postDelayed(getRunnable(changeTime), 1000);

                super.handleMessage(msg);
            
        ;
        handler.postDelayed(getRunnable(changeTime), 1000);
    

    private Runnable getRunnable(final long time) 
        return new Runnable() 
            @Override
            public void run() 
                Message message;
                Calendar calendar = Calendar.getInstance();
                if (calendar.getTimeInMillis() / 1000 == time) 
                    message = new Message();
                    handler.sendMessage(message);
                 else 
                    handler.postDelayed(getRunnable(time),1000);
                
            
        ;
    

上面的例子会产生一个无限循环,所以要小心。 希望对你有用

【讨论】:

【参考方案5】:

您可以以 RGB 方式执行此操作。如果你想在时间里轻轻地改变颜色,你也可以这样检查。

 val countDownTimer = object : CountDownTimer(totalTime, 20) 
                override fun onFinish() 
                    
                
    
                override fun onTick(millisUntilFinished: Long) 
                    val pr = (totalTime - millisUntilFinished).toFloat() / totalTime
                    if(pr <= 1f && pr>=0f)
                        binding.pbTimerRect.progress = pr
                            if ((pr * 255).toInt() <= 255) 
                                if(pr<=0.5) 
                                    binding.lytTimerBackGround.background.setTint(Color.rgb((pr*2* 255).toInt(), 255, 0))
                                 else 
                                    binding.lytTimerBackGround.background.setTint(Color.rgb(255,(255-((pr-0.5)*2* 255).toInt()), 0))
                                
                            
                        
                     else 
                        if(pr<0) 
                            onFinish()
                        
                    
                
            

【讨论】:

以上是关于在android中的计时器1分钟后将背景颜色更改为红色的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将背景颜色从 android.support.design 更改为 MaterialButton

是否可以将控制台中的文本颜色和背景颜色更改为不同的颜色,同时仍然在同一行上? C++

Android:编程自定义按钮背景颜色,同时适合内部按钮

无法从 XIB 中的属性检查器将 UIWebView 背景颜色更改为 clearcolor

带计时器的 vuetify 步进器

如何在设置Google Merchant帐户后将Android应用程序更改为付费?