【问题标题】:How can I make a function that decreases a number (from 800 milliseconds to 200 milliseconds for example)如何创建一个减少数字的函数(例如从 800 毫秒到 200 毫秒)
【发布时间】:2019-01-10 22:16:35
【问题描述】:

定时器设置为 800 毫秒的周期,因此 RandomPositions() 总是会每 800 毫秒(周期)执行一次内部代码。现在,我想要每 20 秒或 20,000 毫秒将此数字减少 50,直到将周期变为 200 毫秒。

目标 - 在游戏中,必须每 20 秒逐渐提高速度。

示例: 第一次执行 - 800 毫秒, 第二次执行 - 750 毫秒, 第三次执行 - 700 毫秒, 等等……

我认为我可以插入一个整数类型的函数(而不是 800),这可以使这项工作从 800 毫秒减少到 200 毫秒。

如何实现这个功能?还是有其他解决方案?

public void RandomPositions() {

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask()
        {
            public void run() {

                getWindowManager().getDefaultDisplay().getMetrics(displaymatrics);
                float dx = r.nextFloat() * displaymatrics.widthPixels/1.2f;
                float dy = r.nextFloat() * displaymatrics.heightPixels/1.2f;
                button.animate().x(dx).y(dy).setDuration(0);


            }
        }, 0, 800);  // first value = Delay   , Second value = Period(what I need to change)

【问题讨论】:

  • 将其设置为一个变量,每次调用该函数时减 50,当然当达到 200 时停止
  • 那就不要用scheduleAtFixedRate(),用schedule(task, delay),每次都改delay。

标签: java android function android-studio android-studio-3.2


【解决方案1】:

我不会为此使用计时器,因为时间间隔一直在变化。

在原版 Android 中,我可能会使用 Handler

Int interval = 800; // milliseconds
Handler handler = new Handler()
Runnable runnable = new Runnable() { 

   @Override void run() {

        //
        // do your logic here
        //

        // decrement interval by 20 milliseconds 
        // if interval - 20 is greater than 200
        interval = interval - 20 > 200 ? interval - 20 : interval;


        // Request an execution of this runnable with the new value of interval
        handler.postDelayed(runnable, interval);
   }
}


public void start() {
   handler.postDelayed(runnable, interval);
}

public void stop() { 
   handler.removeCallbacks(runnable);
}

确保在您想要停止它时调用removeCallbacks,或者当用户离开正在运行的活动/上下文时。

【讨论】:

    【解决方案2】:

    这是一个使用计时器的解决方案。如果您不想在循环中调用该方法,则每次调用时只需将延迟参数减去 50。

        public static void main(String[] args) {                
            Timer timer = new Timer();              
            for(int i = 800; i >= 200; i-=50)
            {
                runTimer(timer, i);         
            }   
        }   
    
        private static void runTimer(Timer timer, int delay) {
            timer.schedule(new TimerTask()
            {
                public void run() {
                }                
            }, 0, delay);  
        }
    

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多