欧美大胆a级视频免费,国产精品日韩经典中文字幕,熟女av一区二区高清区,粉嫩一区二区三区色综合

當(dāng)前位置:首頁(yè) > 觸控技術(shù) > 觸摸屏論文
觸摸屏論文

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

    為了使用功能強(qiáng)大的多點(diǎn)觸控設(shè)備,就需要一種方案去上報(bào)用戶(hù)層所需的詳細(xì)的手指觸摸數(shù)據(jù)。這個(gè)文檔所描述的多點(diǎn)觸控協(xié)議可以讓內(nèi)核驅(qū)動(dòng)程序向用戶(hù)層上報(bào)任意多指的數(shù)據(jù)信息。

    使用說(shuō)明

    單點(diǎn)觸摸信息是以ABS承載并按一定順序發(fā)送,如BTN_TOUCH、ABS_X、ABS_Y、SYNC。而多點(diǎn)觸摸信息則是以ABS_MT承載并按一定順序發(fā)送,如ABS_MT_POSITION_X、ABS_MT_POSITION_Y,然后通過(guò)調(diào)用input_mt_sync()產(chǎn)生一個(gè) SYN_MT_REPORT event來(lái)標(biāo)記一個(gè)點(diǎn)的結(jié)束,告訴接收方接收當(dāng)前手指的信息并準(zhǔn)備接收其它手指的觸控信息。最后調(diào)用 input_sync()函數(shù)上報(bào)觸摸信息開(kāi)始動(dòng)作并告訴接收方開(kāi)始接收下一系列多點(diǎn)觸摸信息。

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

    下面是兩點(diǎn)觸摸支持的最小事件集序列:

    ABS_MT_TOUCH_MAJOR

    ABS_MT_POSITION_X

    ABS_MT_POSITION_Y

    SYN_MT_REPORT      //上報(bào)第一個(gè)點(diǎn)

    ABS_MT_TOUCH_MAJOR

    ABS_MT_POSITION_X

    ABS_MT_POSITION_Y

    SYN_MT_REPORT      //上報(bào)第二個(gè)點(diǎn)

    SYN_REPORT         //開(kāi)始動(dòng)作

    Event 原語(yǔ)

    “接觸”一詞用來(lái)描述一個(gè)物體直接碰到另一個(gè)物體的表面。

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

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

    ABS_MT_WIDTH_MAJOR描述了接觸工具的長(zhǎng)軸

    ABS_MT_WIDTH_MINOR描述了接觸工具的短軸

    ABS_MT_TOUCH_MAJOR := max(X, Y)

    ABS_MT_TOUCH_MINOR := min(X, Y)

    ABS_MT_ORIENTATION := bool(X > Y)

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

    ABS_MT_ORIENTATION

    ABS_MT_POSITION_X接觸面的中心點(diǎn)X坐標(biāo)

    ABS_MT_POSITION_Y接觸面的中心點(diǎn)Y坐標(biāo)

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

    ABS_MT_BLOB_ID形狀集ID,集合幾個(gè)點(diǎn)以描述一個(gè)形狀,很多驅(qū)動(dòng)沒(méi)有形狀屬性,此參數(shù)可以不用。

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

    觸摸軌跡

    僅有少數(shù)設(shè)備可以明觸的標(biāo)識(shí)真實(shí)的 trackingID,多數(shù)情況下 trackingID只能來(lái)標(biāo)識(shí)一次觸摸動(dòng)作的過(guò)程。

    手勢(shì)

    多點(diǎn)觸摸指定的應(yīng)用是創(chuàng)建手勢(shì)動(dòng)作, TOUCH和 WIDTH參數(shù)經(jīng)常用來(lái)區(qū)別手指的壓力和手指間的距離,另外 MINOR類(lèi)的參數(shù)可以用來(lái)區(qū)別設(shè)備的接觸面的大?。c(diǎn)接觸還是面接觸),ORIENTATION可以產(chǎn)生旋轉(zhuǎn)事件。

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

    在Linux的input.h中,多點(diǎn)觸摸功能依賴(lài)于以下幾個(gè)主要的軟件位:

    ……

    #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中對(duì)應(yīng)的軟件位定義在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中,多點(diǎn)觸摸的實(shí)現(xiàn)方法在具體的代碼實(shí)現(xiàn)中和單點(diǎn)是完全區(qū)分開(kāi)的。在Android代碼的EventHub.cpp中,單點(diǎn)屏和多點(diǎn)屏由如下代碼段來(lái)判定:

    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!");

    }

    ……

    }

    我們知道,在觸摸屏驅(qū)動(dòng)中,通常在probe函數(shù)中會(huì)調(diào)用input_set_abs_params給設(shè)備的input_dev結(jié)構(gòu)體初始化,這些input_dev的參數(shù)會(huì)在Android的EventHub.cpp中被讀取。如上可知,如果我們的觸摸屏想被當(dāng)成多點(diǎn)屏被處理,只需要在驅(qū)動(dòng)中給input_dev額外增加以下幾個(gè)參數(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);

    //相當(dāng)于單點(diǎn)屏的ABX_PRESSURE

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

    //相當(dāng)于單點(diǎn)屏的ABS_TOOL_WIDTH

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

    例如一波要上報(bào)3個(gè)點(diǎn):

    ……

    input_mt_sync(input);

    ……

    input_mt_sync(input);

    ……

    input_mt_sync(input);

    input_sync(input);

    注:即使是僅上報(bào)一個(gè)點(diǎn)的單點(diǎn)事件,也需要一次input_my_sync。


相關(guān)文章
精彩評(píng)論:
0  相關(guān)評(píng)論
巫山县| 迁西县| 夏河县| 新野县| 鹤庆县| 宜兰市| 巴塘县| 娄烦县| 三明市| 石楼县| 肇东市| 湾仔区| 新巴尔虎左旗| 岳普湖县| 民县| 洪湖市| 陈巴尔虎旗| 错那县| 长阳| 兴城市| 天长市| 都兰县| 东乌珠穆沁旗| 达州市| 昭通市| 睢宁县| 孟津县| 馆陶县| 陕西省| 会同县| 科技| 和硕县| 安西县| 镇远县| 天津市| 额尔古纳市| 屯门区| 西乌珠穆沁旗| 祁阳县| 琼结县| 海林市|