我无法计算平均打字率(每分钟字符数)。 有时数字太小有时数字太大。 当我在模拟器上运行时,数字非常小; 当我在手机上运行时,数字非常大。 请帮忙。
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;
}
};
}
答案 0 :(得分: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语句与else语句的作用相同,则可以删除整个分支并直接执行这些操作:
if (x) {
foo();
}
else {
foo();
}
与:
相同foo()