如果留意的话,你会发现新版本的QQ、微信、易信都增加了一个输入状态检测的新功能,来提醒你聊天的对方当前是否正在编辑信息。这次在从西安回来的路上,我一直在思考这个东西的原理,到实验室后赶紧做了一些实验,也达到了类似的效果。下图是我QQ上的效果图。
那么它的原理是什么呢?
首先要用到多线程,即需要一个线程去不断检测文本输入框的字符串长度,当输入字符长度在变化时就认为有操作,即“正在输入”。那这就简单了,此时自己的QQ客户端只需将一个boolean型的值通过网络,如http或socket等方式后台传给对方QQ客户端,则对方QQ就会提醒你“正在输入...”。
原理想通后就动手做吧,下面是我写的一段程序,注释比较详细,不多赘述。先来看下运行结果。
注:连续输入c216 linux,则一直提示“正在输入...”。
注:输入结束后,或中间停止输入,则不再提示。
目前,检查间隔sleep设为500ms,正常速度输入时,效果较好。可以自己体验哦!下面是完整代码。
package XiaoMi;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
public class test27 extends Frame {
/**
* @param args
*/
MyTextField myTextField = new MyTextField();
public test27(String title) {
super(title);
Panel disp = new Panel();
disp.setLayout(new FlowLayout()); //设置布局类型
disp.add(myTextField);
new Thread(myTextField).start(); //开启输入检测线程
add("West", disp);
Label info = new Label(""); //添加提示标签控件
add("Center", info);
Button control = new Button("发送"); //添加按钮控件
add("South", control);
pack(); //调整窗口的大小
setVisible(true); //设置可见性
while (true) { //循环检测输入并提示
if (myTextField.isInputing)
info.setText("正在输入...");
else
info.setText("");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new test27("模拟QQ检测输入程序");
}
}
// 定义具有输入检测功能的TextField
class MyTextField extends TextField implements Runnable {
boolean isInputing = false; //是否正在输入
public MyTextField() {
super(""); //文本框默认显示值
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
int strLengthBefore = this.getText().length(); //获取休眠前输入字符串长度
try {
Thread.sleep(500); //调节检测的周期,即灵敏度
} catch (InterruptedException e) {
}
int strLengthAfter = this.getText().length(); //获取休眠后输入字符串长度
if (strLengthAfter != strLengthBefore)
isInputing = true;
else
isInputing = false;
// System.out.println("当前字符长度: " + strLengthAfter); //后台输出
if (isInputing)
System.out.println("正在输入...");
}
}
}
最后,贴上调试时的后台输入,帮助理解!(输入1~9,中间非连续速度输入。)【多线程文章可参考:
guomutian911】
欢迎大家进一步交流、改进!Q:316190672,兰州理工大学,郭立。