欧美大胆a级视频免费,免费无遮挡18禁污网站,一本色道久久加勒比综合,男生用大吊操女生逼视频

當前位置:首頁 > 觸控技術 > 觸摸屏論文
觸摸屏論文

Linux與Android 多點觸摸協(xié)議

    為了使用功能強大的多點觸控設備,就需要一種方案去上報用戶層所需的詳細的手指觸摸數(shù)據。這個文檔所描述的多點觸控協(xié)議可以讓內核驅動程序向用戶層上報任意多指的數(shù)據信息。

    使用說明

    單點觸摸信息是以ABS承載并按一定順序發(fā)送,如BTN_TOUCH、ABS_X、ABS_Y、SYNC。而多點觸摸信息則是以ABS_MT承載并按一定順序發(fā)送,如ABS_MT_POSITION_X、ABS_MT_POSITION_Y,然后通過調用input_mt_sync()產生一個 SYN_MT_REPORT event來標記一個點的結束,告訴接收方接收當前手指的信息并準備接收其它手指的觸控信息。最后調用 input_sync()函數(shù)上報觸摸信息開始動作并告訴接收方開始接收下一系列多點觸摸信息。

    協(xié)議定義了一系列ABS_MT事件,這些事件被分為幾大類,充許只應用其中的一部份,多點觸摸最小的事件集中應包括ABS_MT_TOUCH_MAJOR、ABS_MT_POSITION_X和 ABS_MT_POSITION_Y,以此來實現(xiàn)多點觸摸。如果設備支持ABS_MT_WIDTH_MAJOR這個事件,那么此事件可以提供手指觸摸接觸面積大小。觸摸方向等信息可以由ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION提供。ABS_MT_TOOL_TYPE提供觸摸設備的類別,如手或是筆或是其它。最后有些設備可能會支持ABS_MT_TRACKING_ID,用來支持硬件跟蹤多點信息,即該點屬于哪一條線等。

    下面是兩點觸摸支持的最小事件集序列:

    ABS_MT_TOUCH_MAJOR

    ABS_MT_POSITION_X

    ABS_MT_POSITION_Y

    SYN_MT_REPORT      //上報第一個點

    ABS_MT_TOUCH_MAJOR

    ABS_MT_POSITION_X

    ABS_MT_POSITION_Y

    SYN_MT_REPORT      //上報第二個點

    SYN_REPORT         //開始動作

    Event 原語

    “接觸”一詞用來描述一個物體直接碰到另一個物體的表面。

    ABS_MT_TOUCH_MAJOR描述了主接觸面的長軸,它和X,Y同一個單位,如果一個面的分辨率為X*Y,則ABS_MT_TOUCH_MAJOR的最大值為sqrt(X^2+Y^2)

    ABS_MT_TOUCH_MINOR描述了接觸面的短軸,如果接觸面是圓形,它可以不用。

    ABS_MT_WIDTH_MAJOR描述了接觸工具的長軸

    ABS_MT_WIDTH_MINOR描述了接觸工具的短軸

    ABS_MT_TOUCH_MAJOR := max(X, Y)

    ABS_MT_TOUCH_MINOR := min(X, Y)

    ABS_MT_ORIENTATION := bool(X > Y)

    以上四個參數(shù)可以用來生成額外的觸摸信息,如ABS_MT_TOUCH_MAJOR/ABS_MT_WIDTH_MAJOR的比率可以用來描述壓力。

    ABS_MT_ORIENTATION

    ABS_MT_POSITION_X接觸面的中心點X坐標

    ABS_MT_POSITION_Y接觸面的中心點Y坐標

    ABS_MT_TOOL_TYPE描述接觸工具類型,很多內核驅動無法區(qū)分此參數(shù)如手指及筆,如果是這樣,該參數(shù)可以不用,協(xié)議目前支持MT_TOOL_FINGER和MT_TOOL_PEN兩種類型。

    ABS_MT_BLOB_ID形狀集ID,集合幾個點以描述一個形狀,很多驅動沒有形狀屬性,此參數(shù)可以不用。

    ABS_MT_TRACKING_ID描述了從接觸開始到釋放的整個過程的集合,如果設備不支持,此參數(shù)可是不用。

    觸摸軌跡

    僅有少數(shù)設備可以明觸的標識真實的 trackingID,多數(shù)情況下 trackingID只能來標識一次觸摸動作的過程。

    手勢

    多點觸摸指定的應用是創(chuàng)建手勢動作, TOUCH和 WIDTH參數(shù)經常用來區(qū)別手指的壓力和手指間的距離,另外 MINOR類的參數(shù)可以用來區(qū)別設備的接觸面的大小(點接觸還是面接觸),ORIENTATION可以產生旋轉事件。

    在Linux內核支持的基礎上,Android在其2.0源碼中加入多點觸摸功能。由此觸摸屏在Android的frameworks被完全分為2種實現(xiàn)途徑:單點觸摸屏的單點方式,多點觸摸屏的單點和多點方式。

    在Linux的input.h中,多點觸摸功能依賴于以下幾個主要的軟件位:

    ……

    #define SYN_REPORT0

    #define SYN_CONFIG1

    #define SYN_MT_REPORT2

    ……

    #define ABS_MT_TOUCH_MAJOR0x30

    #define ABS_MT_TOUCH_MINOR0x31

    #define ABS_MT_WIDTH_MAJOR0x32

    #define ABS_MT_WIDTH_MINOR0x33

    #define ABS_MT_ORIENTATION0x34

    #define ABS_MT_POSITION_X0x35

    #define ABS_MT_POSITION_Y0x36

    #define ABS_MT_TOOL_TYPE0x37

    #define ABS_MT_BLOB_ID0x38

    ……

    在Android中對應的軟件位定義在RawInputEvent.java中:

    ……

    public class RawInputEvent {

    ……

 public static final int CLASS_TOUCHSCREEN_MT = 0x00000010;

    ……

    public static final int ABS_MT_TOUCH_MAJOR = 0x30;

    public static final int ABS_MT_TOUCH_MINOR = 0x31;

    public static final int ABS_MT_WIDTH_MAJOR = 0x32;

    public static final int ABS_MT_WIDTH_MINOR = 0x33;

    public static final int ABS_MT_ORIENTATION = 0x34;

    public static final int ABS_MT_POSITION_X = 0x35;

    public static final int ABS_MT_POSITION_Y = 0x36;

    public static final int ABS_MT_TOOL_TYPE = 0x37;

    public static final int ABS_MT_BLOB_ID = 0x38;

    ……

    public static final int SYN_REPORT = 0;

    public static final int SYN_CONFIG = 1;

    public static final int SYN_MT_REPORT = 2;

    ……

    在Android中,多點觸摸的實現(xiàn)方法在具體的代碼實現(xiàn)中和單點是完全區(qū)分開的。在Android代碼的EventHub.cpp中,單點屏和多點屏由如下代碼段來判定:

    int EventHub::open_device(const char *deviceName)

    {

    ……

    if (test_bit(ABS_MT_TOUCH_MAJOR, abs_bitmask)

    && test_bit(ABS_MT_POSITION_X, abs_bitmask)

    && test_bit(ABS_MT_POSITION_Y, abs_bitmask)) {

    device->classes |= CLASS_TOUCHSCREEN | CLASS_TOUCHSCREEN_MT;

    //LOGI("It is a multi-touch screen!");

    }

    //single-touch?

    else if (test_bit(BTN_TOUCH, key_bitmask)

    && test_bit(ABS_X, abs_bitmask)

    && test_bit(ABS_Y, abs_bitmask)) {

    device->classes |= CLASS_TOUCHSCREEN;

    //LOGI("It is a single-touch screen!");

    }

    ……

    }

    我們知道,在觸摸屏驅動中,通常在probe函數(shù)中會調用input_set_abs_params給設備的input_dev結構體初始化,這些input_dev的參數(shù)會在Android的EventHub.cpp中被讀取。如上可知,如果我們的觸摸屏想被當成多點屏被處理,只需要在驅動中給input_dev額外增加以下幾個參數(shù)即可:

    input_set_abs_params(mcs_data.input, ABS_MT_POSITION_X, pdata->abs_x_min,  pdata->abs_x_max, 0, 0);

    input_set_abs_params(mcs_data.input, ABS_MT_POSITION_Y, pdata->abs_y_min,  pdata->abs_y_max, 0, 0);

    input_set_abs_params(mcs_data.input, ABS_MT_TOUCH_MAJOR, 0, 15, 0, 0);

    //相當于單點屏的ABX_PRESSURE

    input_set_abs_params(mcs_data.input, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0);

    //相當于單點屏的ABS_TOOL_WIDTH

    由于多點觸摸技術需要采集到多個點,然后再一起處理這些點,所以在軟件實現(xiàn)中需要保證每一波點的準確性和完整性。因此,Linux內核提供了input_mt_sync(struct input_dev * input)函數(shù)。在每波的每個點上報后需要緊跟一句input_mt_sync(), 當這波所有點上報后再使用input_sync()進行同步。

    例如一波要上報3個點:

    ……

    input_mt_sync(input);

    ……

    input_mt_sync(input);

    ……

    input_mt_sync(input);

    input_sync(input);

    注:即使是僅上報一個點的單點事件,也需要一次input_my_sync。


相關文章
精彩評論:
0  相關評論
插逼黄嫩穴白虎| 真人做爰48姿势性视频| 亚洲日本一本dvd高清| 无人区乱码一区二区三区| 国产h视频在线观看视频| 香蕉国产人午夜视频在线| 日本视频一区二区三区免费| 哦哦不要舔啊啊免费视频| 草草影院精品一区二区三区| 嗯啊好痛好大轻点操视频| 少妇饥渴偷公乱A级无码| 轻点操快操死我了的视频| 斯啊啊啊别插了??网站| 超漂亮校花美女爱爱私拍| 亚洲国产精品伦理在线观看 | 青楼传媒18禁在线网站| 日韩欧美tⅴ一中文字暮| 操逼用力操我视频免费看| 大黑鸡巴操进来免费观看| 20182019中文字幕| 大鸡巴操小嫩逼冒沫视频| 成 人 综合 亚洲另类| 激烈打扑克运动又疼又叫| 午夜伦伦电影理论片A片| 嗯~慢点~鸡巴好大视频| 日韩一区二区三区欧美图| 国产精品欧美人人人人爽| 日本插肉棒视频| 丁香婷婷情涩五月天综合| 午夜a片无码区在线观看| 日韩视频一区 二区 三区| 藤浦惠一区二区三区精品| 东北乱轮色网站| 国产黄色aaa在线观看| 中出纯洁高中生在线观看| 龙腾小说亚洲最大yy网| 在线精品国产91吴梦梦| 国产欧美一区二区在线看| 操逼叉逼逼视频| 吃女人逼的网站| 小烧逼干死你h|