移植MIDP2程序到手写板设备,开始的时候对于pointerDragged事件kvm的通知机制没有什么印象,直接在pointerDragged的方法内打印通知过来的坐标.
在MOTO的Linux手写板的模拟器上测试,得出的结论是底层的kvm在stylus没有离开触摸屏的状态下,一旦x或者y坐标移动了两个象素就会通知canvas.
对于点击事件,一个x,y坐标足矣;但是对于拖拽事件的处理,默认的处理只是通知当前最新的坐标,显然是无法判断运动轨迹的方向,最简单的就是做一个轨迹坐标缓冲区,存储一定长度的拖拽移动轨迹,在程序中的实现也是这样,关键的功能代码部分:
/**
* <pre>
* 由于拖动的动作会将整个移动的轨迹坐标发过来,这里将
* 先建立一个轨迹的缓冲,只有缓冲区填满后才会触发注册
* 的组件的pointerDragged的方法通知事件.
*
* 缓冲区深度的不宜过大,深的缓冲区将导致微小的拖动操作
* 被系统忽略;深度太浅的话缓冲区本身也就没有意义了.
*
* 组件通过查询轨迹缓冲区可以得知拖动的方向和拖动的距离.
* </pre>
*/
public static final int TRACK_POS_BUF_DEPTH = 3;
public int[][] trackPosBuffer = new int[TRACK_POS_BUF_DEPTH][2];
private short trackBufPos = 0;//must be less than the length of the register!
/**
* 重置归位轨迹缓冲区.
*
*/
private void resetTrackPosBuffer() {
for (int i = 0; i < trackPosBuffer.length; i++) {
trackPosBuffer[i][0] = trackPosBuffer[i][1] = 0;
}
trackBufPos = 0;
}
/**
* 记录拖动的轨迹,一旦寄存器填满的时候返回true,否则返回false.
* @param x
* @param y
* @return
*/
private boolean bufferTrackPos(int x, int y) {
if (this.trackBufPos >= TRACK_POS_BUF_DEPTH)
this.resetTrackPosBuffer();
boolean result = false;
if (this.trackBufPos == (TRACK_POS_BUF_DEPTH - 1)) {
result = true;
} else {
result = false;
}
trackPosBuffer[this.trackBufPos][0] = x;
trackPosBuffer[this.trackBufPos][1] = y;
this.trackBufPos++;
return result;
}
在MOTO的Linux手写板的模拟器上测试,得出的结论是底层的kvm在stylus没有离开触摸屏的状态下,一旦x或者y坐标移动了两个象素就会通知canvas.
对于点击事件,一个x,y坐标足矣;但是对于拖拽事件的处理,默认的处理只是通知当前最新的坐标,显然是无法判断运动轨迹的方向,最简单的就是做一个轨迹坐标缓冲区,存储一定长度的拖拽移动轨迹,在程序中的实现也是这样,关键的功能代码部分:
/**
* <pre>
* 由于拖动的动作会将整个移动的轨迹坐标发过来,这里将
* 先建立一个轨迹的缓冲,只有缓冲区填满后才会触发注册
* 的组件的pointerDragged的方法通知事件.
*
* 缓冲区深度的不宜过大,深的缓冲区将导致微小的拖动操作
* 被系统忽略;深度太浅的话缓冲区本身也就没有意义了.
*
* 组件通过查询轨迹缓冲区可以得知拖动的方向和拖动的距离.
* </pre>
*/
public static final int TRACK_POS_BUF_DEPTH = 3;
public int[][] trackPosBuffer = new int[TRACK_POS_BUF_DEPTH][2];
private short trackBufPos = 0;//must be less than the length of the register!
/**
* 重置归位轨迹缓冲区.
*
*/
private void resetTrackPosBuffer() {
for (int i = 0; i < trackPosBuffer.length; i++) {
trackPosBuffer[i][0] = trackPosBuffer[i][1] = 0;
}
trackBufPos = 0;
}
/**
* 记录拖动的轨迹,一旦寄存器填满的时候返回true,否则返回false.
* @param x
* @param y
* @return
*/
private boolean bufferTrackPos(int x, int y) {
if (this.trackBufPos >= TRACK_POS_BUF_DEPTH)
this.resetTrackPosBuffer();
boolean result = false;
if (this.trackBufPos == (TRACK_POS_BUF_DEPTH - 1)) {
result = true;
} else {
result = false;
}
trackPosBuffer[this.trackBufPos][0] = x;
trackPosBuffer[this.trackBufPos][1] = y;
this.trackBufPos++;
return result;
}