2016-12-07 75 views
0

我无法计算平均打字速率(每分钟字符数)。 有时数字太小,有时数字太大。 当我在模拟器上运行它时,数字非常小; 当我在手机上运行它时,数字会非常大。 请帮忙。我无法计算平均打字速度(字符每分钟)

package com.example.typeit; 

import android.os.SystemClock; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

import java.util.Date; 

public class MainActivity extends AppCompatActivity { 
TextView test, min; 
EditText input; 
long startTime; 
double sTime, tTime; 
boolean isStarted; 
//ProgressBar progressBar; 
int count; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    input = (EditText) findViewById(R.id.input); 
    min = (TextView) findViewById(R.id.min); 
    //progressBar = (ProgressBar) findViewById(R.id.progress); 

    input.setOnKeyListener(keyListener); 
    isStarted = true; 
    count = 0; 
} 

View.OnKeyListener keyListener = new View.OnKeyListener() { 
    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if (event.getAction() == event.ACTION_DOWN) { 
      if (isStarted) { 
       sTime = new Date().getTime(); 
       isStarted = false; 
       return false; 
      } 
      //if(keyCode == event.KEYCODE_SHIFT_LEFT) return false; 
      if (Character.isUpperCase(input.getText().charAt(count))) { 
       if (input.getText().toString().charAt(count) != keyCode + 36) { 
        min.setText(""); 
       } else { 
        min.setText(""); 
       } 
      } else if (Character.isLowerCase(input.getText().charAt(count))) { 
       if (input.getText().toString().charAt(count) != keyCode + 68) { 
        min.setText(""); 
       } else { 
        min.setText(""); 
       } 
      } 
      if (keyCode == KeyEvent.KEYCODE_DEL) count--; 
      else count++; 

      tTime = (new Date().getTime() - sTime)/1000/60; 

      int result = (int) (count/tTime); 
      if (result < 0) result = 0; 
      //  progressBar.setProgress(result); 
      if (count == input.getText().toString().length()) { 
       input.setText(""); 
       min.setText("" + result); 
      } 
     } 
     return false; 
    } 
}; 
} 

回答

1

android模拟器已知非常慢。所以测量打字速度就不准确了。

接下来,我强​​烈建议从其余的处理中提取打字速率的测量。换句话说:你的onKey监听器正在处理很多责任。将计算重构为新的类:

class TypeRateCalculator(){ 
    private Date startTime; 
    private Date elapsedTime; 
    private int characterCount = 0; 

    public void startMeasuring() { 
     startTime = new Date(); 
    } 

    public int updateTypingRate() { 
     characterCount++; 
     elapsedTime = new Date(); 
     long delta = (elapsedTime.getTime() - startTime.getTime())/1000/60; 
     int typingRate = Math.max(0, (int) (characterCount/ delta)); 
     return typingRate; 
    } 
} 

然后在您的keyListener中调用updateTypingRate()。

最后:如果if语句不一样的其他语句,你可以删除整个分支,只是做的东西直接:

if (x) { 
    foo(); 
} 
else { 
    foo(); 
} 

是一样的:

foo()