Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android 【真機】與【模擬器】觸摸屏事件的模擬差異分析

Android 【真機】與【模擬器】觸摸屏事件的模擬差異分析

編輯:Android開發教程

Android 真機和模擬器的差異問題,是永恆的話題,問不完的為什麼,解不完的迷。模擬器的存在,有它的作用,但不要什麼都相信模擬器。除非你是Android純上層應用開發人員或者愛好者,否則我建議你扔掉模擬器。它理想化的引導給我們添了不少麻煩。當然,這也是件好事。最起碼,讓我有興趣去尋求答案,讓我收獲了更多。

 問題的緣由是有個自動化測試的需求,我需要寫腳本模擬點擊觸摸屏的一系列操作,以代替手工測試(話說~遇上連續啟動1000次camera並且拍照後退出這種變態測試,你們都是怎麼做的?)。以此來證明:頭兒,此bug真的解了!

Linux上可以通過sendEvent來模擬鍵盤或者鼠標點擊事件,而Android是基於Linux2.6的,所以也可以模擬點擊事件。網絡文章很多都給出這樣一段數據信息,告訴你怎麼去實現模擬點擊:

adb shell sendevent /dev/input/event0 3 0 110       //x坐標

adb shell sendevent /dev/input/event0 3 1 70         //y坐標

adb shell sendevent /dev/input/event0 1 330 1       //按下狀態,准確的說是有壓力值

adb shell sendevent /dev/input/event0 0 0 0           //必要的一行數據

adb shell sendevent /dev/input/event0 1 330 0       //抬起狀態,無壓力值

adb shell sendevent /dev/input/event0 0 0 0           //必要的一行,相當於終止一段完整數據的標致

用上面的方法可以點擊模擬器的(110,70)點,但是,在真機上,卻不可以,原因有兩點。

1.  /dev/input/event0 ×

 模擬器上只有一個/dev/input/event0,但是真機上不是(如果還真是,那你這設備還是別出廠了-_-||)。

用cat獲得的設備對應event信息:

# cat /proc/bus/input/devices

I: Bus=0000 Vendor=0000 Product=0000 Version=0000

N: Name="qtouch-touchscreen"

P: Phys=

S: Sysfs=/devices/virtual/input/input5

U: Uniq=

H: Handlers=event5

B: EV=b

B: KEY=400 0 4 0 0 0 0 0 0 0 0

B: ABS=2750000 11030003

"qtouch-touchscreen"不是規定死的event幾,話說1234567都有可能,看你設備了。

2.  數據類型 ×

 探究原因的時候,通過:

#adb shell getevent /dev/input/event5 > getvalue

可以得到:

0003 0035 000007c8

0003 0036 00000771

0003 0038 00000001

0000 0002 00000000

0003 0037 00000010

0000 0000 00000000

這和我之前所想象的坐標信息不一樣,看到c,就知道是16進制數喽,第一反應就是做個10進制的轉換。具體怎麼轉換?

int main (int argc, char *argv[]) 點點點... (這個.c 還不會寫?不會寫還不會搜嗎?)

可以得到:

3 53 1992

3 54 1905

3 56 1

0 2 0

3 55 16

0 0 0

先不管為什麼,做個測試驗證下結果:

adb shell sendevent /dev/input/event5 3 53 1992

adb shell sendevent /dev/input/event5 3 54 1905

adb shell sendevent /dev/input/event5 3 56 1

adb shell sendevent /dev/input/event5 0 2 0

adb shell sendevent /dev/input/event5 3 55 16

adb shell sendevent /dev/input/event5 0 0 0

這裡提一下,倘若操作的數據特別大,那我們可以利用vi的強大,在腳本中實現批量數據的轉換,例如:

vim '+%normal gg' '+.,$g/^/s//adb shell sendevent //dev//input//event5 /g' '+wq' value

結果可以實現點擊

既然測試的結果證明那亂七八糟的數是對的,那就必究其緣由!其實問題的根本原因,是因為手裡的真機設備已經支持了多點觸摸。

在Android中,多點觸摸功能依賴於RawInputEvent.java 中定義的以下幾個主要的軟件位:

public class RawInputEvent {     
        
...    
  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;     
        
...    
}

在 KeyInputQueue.java中,系統創建了一個線程,把所有的Input事件放入一個隊列,在 KeyInputQueue.java的最後,將多點事件類型轉化為單點事件類型,返回一個新的InputDevice。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved