linux应用程序_1_文本浏览器_8_输入设备_5_触摸屏滑动翻页
本篇在线程机制的基础上,为触摸屏输入添加滑动翻页功能,并将退出控制移动到右上角
主要修改触摸屏获取事件接口:
1、读取数据,没有数据则休眠
2、记录第一次按下的数据
3、记录松开的数据
4、判断离开点是否在屏幕右上角40像素长宽的正方形中,若是则退出
5、判断松开点与第一次按下点的x坐标差值,据此记录翻页事件
6、若5中不满足翻页条件,判断松开点位置,据此记录翻页事件
(设定的滑动距离比较小,因此6中按下点与松开点的x坐标相差不会太大)
#define PRESS 0
#define RELEASE 1
static int TsInputGetEvent(PT_InputEventOpr ptInputEventOpr)
{
static struct timeval tPreTime;
static struct ts_sample tSampPress, tSampRelease;
static int iFlag = RELEASE;
int iTimeOut, iSlip;
struct ts_sample tSamp;
if(ts_read(g_ptTs, &tSamp, 1) < 0)
return -1;
if(iFlag == RELEASE)
{
if(tSamp.pressure == 1)
{
iFlag = PRESS;
tSampPress = tSamp;
}
}
else
{
if(tSamp.pressure == 0)
{
iFlag = RELEASE;
tSampRelease = tSamp;
if((tSampRelease.x >= (g_iXres - 40)) && (tSampRelease.y <= 40))
{
ptInputEventOpr->iVal = INPUT_VAL_EXIT;
return 0;
}
iSlip = XSlipDirt(tSampPress.x, tSampRelease.x);
switch(iSlip)
{
case SLIP_NO :
{
ptInputEventOpr->iVal = INPUT_VAL_UNKNOWN;
break;
}
case SLIP_LEFT :
{
ptInputEventOpr->iVal = INPUT_VAL_PRE;
return 0;
}
case SLIP_RIGHT :
{
ptInputEventOpr->iVal = INPUT_VAL_NEXT;
return 0;
}
}
iTimeOut = IsOutOf100ms(&tPreTime, &tSampRelease.tv);
if(iTimeOut)
{
if(tSampRelease.x < (g_iXres / 3))
ptInputEventOpr->iVal = INPUT_VAL_PRE;
else if(tSampRelease.x > (g_iXres * 2 / 3))
ptInputEventOpr->iVal = INPUT_VAL_NEXT;
else
ptInputEventOpr->iVal = INPUT_VAL_UNKNOWN;
return 0;
}
}
}
return -1;
}
添加滑动方向判断
#define SLIP_LEFT 1
#define SLIP_RIGHT 2
#define SLIP_NO -1
static int XSlipDirt(int iPressX, int iReleaseX)
{
int iDelta = iReleaseX - iPressX;
if(iDelta > (g_iXres / 12))
return SLIP_RIGHT;
else if(iDelta < (0 - g_iXres / 12))
return SLIP_LEFT;
return SLIP_NO;
}