Android Studio单击imageview减少计时器

时间:2018-02-14 01:57:25

标签: java android timer

这是我第一次在StackOverflow上发布内容,而这只是因为我觉得这是其中一次,我无法从庞大的互联网上找到我需要的东西!

我目前正在制作一个Android应用程序,这是一个游戏,我有一个球是一个imageview,每次我点击球,它移动到一个随机的位置,我已经建立了这个方法:

private void changePos() {
    RelativeLayout gameLayout = findViewById(R.id.gameFrame);
    int frameHeight = gameLayout.getHeight();
    int frameWidth = gameLayout.getWidth();

    Random ballLocationY = new Random();
    int ballY = ballLocationY.nextInt(frameHeight);

    Random ballLocationX = new Random();
    int ballX = ballLocationX.nextInt(frameWidth);

    gameLayout.setY(ballY);
    gameLayout.setX(ballX);
}

所以我正在努力的是每次点击减少计时器。 我想要做的是每按一下球一定比例减少计时器。

基本上每次用户点击球时,计时器从0开始向上计数并以秒和毫秒计数,并且在3秒时标记游戏结束。

这是我正在玩的方法:

Runnable updateThreadTimer = new Runnable() {
    @Override
    public void run() {
        timeInMilliseconds = System.Clock.uptimeMillis() - startTime();
        updateTime = timeSwapBuff + timeInMilliseconds;
        int secs = (int) (updateTime / 1000);
        countDownText.setText("" + String.format("%2d", secs) + ":"
                                 + String.format("%3d", timeInMilliseconds));
        mHandler.postDelayed(this, 0);

        if (secs == 3 && timeInMilliseconds >= 3000) {
             timeSwapBuff += timeInMilliseconds;
             mHandler.removeCallbacks(updateThreadTimer);   
        }
    }
}

必要的变量:

long startTime = 0L, timeInMilliseconds = 0L, timeSwapBuff = 0L, updateTime = 0L;

Handler mHandler = new Handler();

然后我在Overridden onCreate方法中有这个:

ball.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
         if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
             changePos();
             startTime = SystemClock.uptimeMillis();
             mHandler.postDelayed(updateThreadTimer, 0);
         }
         return true;
    }
}

所以我得到的是一个计时器,每次点击按钮都会重置为0,然后重新开始。并且计时器以秒和毫秒显示:0:0000,这是我想要的,但我希望每次点击减少一定比例并更新时间。 因此,让我们说计数器以3秒的限制开始,在点击几次球之后,计时器最终会下降,如果计时器超过那个时间,游戏就会失败。

显然,为了直截了当,我已经简化了很多代码。 我想知道是否有人对如何处理我遇到的问题有任何建议。

如果问题没有得到正确处理,我还要道歉,这是第一次发帖,如果有任何问题,请留下建议。继续!

而且我还想再提一次,我已经四处寻找这样的解决方案了,而且我放在一起的代码来自很多不同的来源,所以我觉得我很喜欢完成了我的研究,无法找到任何东西,因此我转向StackOverflow!

1 个答案:

答案 0 :(得分:0)

所以我想我会回答我自己的问题,因为我现在已经解决了这个问题,也希望这可以解决一些问题。

我重新编写了代码的某些部分并抓住了Runnable方法,而是采用了一种使用CountDownTimer类的方法。

private long currentTime;
private long maxTimer = 3000;
private double fivePercent = .05;
private CountDownTimer myTimer = null; 

protected void onCreate(Bundle savedInstanceState) {
    // Some code...

    // Assign 3000 to currentTime
    currentTime = maxTimer;

    ball.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    if (myTimer != null) {
                        // Cancel timer
                        myTimer.cancel();
                        // Calculating 5 % from maxTimer
                        long a = (long) (maxTimer * fivePercent);
                        maxTimer -= a;
                        // Storing new maxTimer in currentTime     
                        currentTime = maxTimer;
                    }

                   myTimer = new CountDownTimer(currentTime, 1) {
                       @Override
                       public void onTick(long millisUntilFinished) {
                           countDownText.setText("Time: " + String.valueOf(millisUntilFinished));
                           currentTime = millisUntilFinished;
                       }

                       @Override
                       public void onFinish() {
                           Intent intent = new Intent(getApplicationContext(), ResultsActivity.class);
                           GameActivity.this.startActivity(intent); 
                       }
                   }.start();

               changePos();
               scoreLabel.setText("Score: " + score++ + "");
            }
            return true;
        }
    });
}

我已经简化了代码以用于演示目的,但基本上我所做的是创建一个CountDownTimer,每当我点击球时,CountDownTimer将被取消,并调用一个新的,然后创建一个新的CountDownTimer它将计算5%并将结果放入新的CountDownTimer。