这个问题我大致解释一下,PointerTracker.java中的setPressedKeyGraphics是控制按下键时变蓝色的函数,setReleasedKeyGraphics是控制从蓝色变回黑色的函数,分别在onDownEventInternal和onUpEventInternal中调用。
当快速用鼠标点击虚拟键盘时,会发生变成蓝色没有变回来的情况,就是这两个函数没有匹配地调用导致的。
为什么没有匹配呢?通过log分析来看,setPressedKeyGraphics的key值和setReleasedKeyGraphics的key值没有对应上。而出现这种情况是因为:
在快速用鼠标点击虚拟键盘时,
实际上会有先down的事件,然后move的事件,再up这样的事件发生。正常情况是接收到down事件就去调setPressedKeyGraphics使之变蓝,接收move的事件时处理move事件,会掉setReleasedKeyGraphics,因为你move走了,这个键也不应该显示蓝色了。然后移到另一个键时,你up了鼠标,所以会处理up事件,此时会判断是否到新的键了,如果是新的键,就会setReleasedKeyGraphics新的键。但是现在的情况是由于太快速地点击,中间的move事件没有处理,没有调用onMoveEven函数,所以旧的key没有处理到,直接去处理up事件时新的键了。
所以就会出现快速点击时,虚拟键盘按下后蓝色图示无法消失的现象。解决的办法可以按照如下:
在PointerTracker.java中的onUpEventInternal函数里面,在setReleasedKeyGraphics(keyIndex);前加一句:
setReleasedKeyGraphics(getKeyIndexOn(mKeyX, mKeyY));