杞浇锛氭湰鏂囧嚭鑷?鈥滅偢姘寸敓鑿?鈥?鍗氬:http://yuesun.blog.51cto.com


绗竴绔?/span> 鎽樿

鍦?span style="font-family: Times New Roman;">Linux 鍐呮牳鏀寔鐨勫熀纭€涓婏紝 Android 鍦ㄥ叾 2.0 婧愮爜涓姞鍏ュ鐐硅Е鎽稿姛鑳姐€傜敱姝よЕ鎽稿睆鍦?/span> Android 鐨?/span> frameworks 琚畬鍏ㄥ垎涓?/span> 2 绉嶅疄鐜伴€斿緞锛氬崟鐐硅Е鎽稿睆鐨勫崟鐐规柟寮忥紝澶氱偣瑙︽懜灞忕殑鍗曠偣鍜屽鐐规柟寮忋€?/span>

绗簩绔?/span> 杞欢浣?/span>

鍦?span style="font-family: Times New Roman;">Linux 鐨?/span> input.h 涓紝澶氱偣瑙︽懜鍔熻兘渚濊禆浜庝互涓嬪嚑涓富瑕佺殑杞欢浣嶏細

鈥︹€︹€︹€︹€︹€︹€︹€︹€?/span> ..

#defineSYN_REPORT 0

#defineSYN_CONFIG 1

#defineSYN_MT_REPORT 2

鈥︹€︹€︹€︹€︹€︹€︹€︹€?/span> ...

#defineABS_MT_TOUCH_MAJOR 0x30 /*Majoraxisoftouchingellipse*/

#defineABS_MT_TOUCH_MINOR 0x31 /*Minoraxis(omitifcircular)*/

#defineABS_MT_WIDTH_MAJOR 0x32 /*Majoraxisofapproachingellipse*/

#defineABS_MT_WIDTH_MINOR 0x33 /*Minoraxis(omitifcircular)*/

#defineABS_MT_ORIENTATION 0x34 /*Ellipseorientation*/

#defineABS_MT_POSITION_X 0x35 /*CenterXellipseposition*/

#defineABS_MT_POSITION_Y 0x36 /*CenterYellipseposition*/

#defineABS_MT_TOOL_TYPE 0x37 /*Typeoftouchingdevice*/

#defineABS_MT_BLOB_ID 0x38 /*Groupasetofpacketsasablob*/

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span>

鍦?span style="font-family: Times New Roman;">Android 涓搴旂殑杞欢浣嶅畾涔夊湪 RawInputEvent.java 涓?/span> :

鈥︹€︹€︹€︹€︹€︹€?/span> ..

publicclassRawInputEvent{

鈥︹€︹€︹€︹€︹€?/span> .

publicstaticfinalintCLASS_TOUCHSCREEN_MT=0x00000010;

鈥︹€︹€︹€︹€︹€?/span> ..

publicstaticfinalintABS_MT_TOUCH_MAJOR=0x30;

publicstaticfinalintABS_MT_TOUCH_MINOR=0x31;

publicstaticfinalintABS_MT_WIDTH_MAJOR=0x32;

publicstaticfinalintABS_MT_WIDTH_MINOR=0x33;

publicstaticfinalintABS_MT_ORIENTATION=0x34;

publicstaticfinalintABS_MT_POSITION_X=0x35;

publicstaticfinalintABS_MT_POSITION_Y=0x36;

publicstaticfinalintABS_MT_TOOL_TYPE=0x37;

publicstaticfinalintABS_MT_BLOB_ID=0x38;

鈥︹€︹€︹€︹€︹€︹€?/span> .

publicstaticfinalintSYN_REPORT=0;

publicstaticfinalintSYN_CONFIG=1;

publicstaticfinalintSYN_MT_REPORT=2;

鈥︹€︹€︹€︹€︹€?/span> ..

鍦?span style="font-family: Times New Roman;">Android 涓紝澶氱偣瑙︽懜鐨勫疄鐜版柟娉曞湪鍏蜂綋鐨勪唬鐮佸疄鐜颁腑鍜屽崟鐐规槸瀹屽叏鍖哄垎寮€鐨勩€傚湪 Android 浠g爜鐨?/span> EventHub.cpp 涓紝鍗曠偣灞忓拰澶氱偣灞忕敱濡備笅浠g爜娈垫潵鍒ゅ畾锛?/span>

intEventHub::open_device(constchar*deviceName)

{

鈥︹€︹€︹€︹€︹€︹€︹€︹€?/span>

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

}

//single-touch?

elseif(test_bit(BTN_TOUCH,key_bitmask)

&&test_bit(ABS_X,abs_bitmask)

&&test_bit(ABS_Y,abs_bitmask)){

device->classes|=CLASS_TOUCHSCREEN;

// LOGI("Itisasingle-touchscreen!");

}

鈥︹€︹€︹€︹€︹€?/span> ..

}

鎴戜滑鐭ラ亾锛屽湪瑙︽懜灞忛┍鍔ㄤ腑锛岄€氬父鍦?span style="font-family: Times New Roman;">probe 鍑芥暟涓細璋冪敤 input_set_abs_params 缁欒澶囩殑input_dev 缁撴瀯浣撳垵濮嬪寲锛岃繖浜?/span> input_dev 鐨勫弬鏁颁細鍦?/span> Android 鐨?/span> EventHub.cpp 涓璇诲彇銆傚涓婂彲鐭ワ紝濡傛灉鎴戜滑鐨勮Е鎽稿睆鎯宠褰撴垚澶氱偣灞忚澶勭悊锛屽彧闇€瑕佸湪椹卞姩涓粰 input_dev 棰濆澧炲姞浠ヤ笅鍑犱釜鍙傛暟鍗冲彲锛?/span>

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

//鐩稿綋浜庡崟鐐瑰睆鐨?/span> ABX_PRESSURE

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

//鐩稿綋浜庡崟鐐瑰睆鐨?/span> ABS_TOOL_WIDTH

娉細

涓轰簡璁╂垜浠殑椹卞姩浠g爜鏀寔鎵€鏈夌殑Android 鐗堟湰锛屾棤璁烘槸澶氱偣灞忚繕鏄崟鐐瑰睆锛屼竴鑸兘浼氫繚鐣欏崟鐐瑰睆鐨勪簨浠讹紝濡?/span> ABS_TOUCH,ABS_PRESSURE,ABS_X,ABS_Y 绛夈€傚彟澶栵紝鐢变簬鍦?/span> Android2.0 鍓嶆敮鎸佸鐐圭殑 frameworks 澶у鏄敤 HAT0X,HAT0Y 鏉ュ疄鐜扮殑锛屾墍浠ヤ竴鑸篃浼氫笂鎶ヨ繖 2 涓簨浠躲€?/span>

绗笁绔?/span> 鍚屾鏂瑰紡

鐢变簬澶氱偣瑙︽懜鎶€鏈渶瑕侀噰闆嗗埌澶氫釜鐐癸紝鐒跺悗鍐嶄竴璧峰鐞嗚繖浜涚偣锛屾墍浠ュ湪杞欢瀹炵幇涓渶瑕佷繚璇佹瘡涓€娉㈢偣鐨勫噯纭€у拰瀹屾暣鎬с€傚洜姝わ紝Linux 鍐呮牳鎻愪緵浜?/span> input_mt_sync(structinput_dev*input) 鍑芥暟銆傚湪姣忔尝鐨勬瘡涓偣涓婃姤鍚庨渶瑕佺揣璺熶竴鍙?/span> input_mt_sync(), 褰撹繖娉㈡墍鏈夌偣涓婃姤鍚庡啀浣跨敤 input_sync() 杩涜鍚屾銆備緥濡備竴娉㈣涓婃姤 3 涓偣锛?/span>

/*涓婃姤鐐?/span> 1*/

鈥︹€︹€︹€︹€?/span> ..

input_mt_sync(input);

/*涓婃姤鐐?/span> 2*/

鈥︹€︹€︹€︹€?/span> ..

input_mt_sync(input);

/*涓婃姤鐐?/span> 3*/

鈥︹€︹€︹€︹€?/span> ..

input_mt_sync(input);

input_sync(input);

娉細鍗充娇鏄粎涓婃姤涓€涓偣鐨勫崟鐐逛簨浠讹紝涔熼渶瑕佷竴娆?span style="font-family: Times New Roman;">input_my_sync 銆?/span>


鍦?span style="font-family: Times New Roman;">Android 鐨?/span> KeyInputQueue.java 涓紝绯荤粺鍒涘缓浜嗕竴涓嚎绋嬶紝鐒跺悗鎶婃墍鏈夌殑 Input 浜嬩欢鏀惧叆涓€涓槦鍒楋細

publicabstractclassKeyInputQueue{

鈥︹€︹€︹€︹€︹€︹€︹€?/span>

ThreadmThread=newThread("InputDeviceReader"){

publicvoidrun(){

android.os.Process.setThreadPriority(

android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);

try{

RawInputEventev=newRawInputEvent();

while(true){

InputDevicedi;

//block,doesn'treleasethemonitor

readEvent(ev);

if(ev.type==RawInputEvent.EV_DEVICE_ADDED){

synchronized(mFirst){

di=newInputDevice(ev.deviceId);

mDevices.put(ev.deviceId,di);

configChanged=true;

}

}elseif(ev.type==RawInputEvent.EV_DEVICE_REMOVED){

synchronized(mFirst){

Log.i(TAG,"Deviceremoved:id=0x"

+Integer.toHexString(ev.deviceId));

di=mDevices.get(ev.deviceId);

if(di!=null){

mDevices.delete(ev.deviceId);

configChanged=true;

}else{

Log.w(TAG,"Baddeviceid:"+ev.deviceId);

}

}

}else{

di=getInputDevice(ev.deviceId);

//firstcrackatit

send=preprocessEvent(di,ev);

if(ev.type==RawInputEvent.EV_KEY){

di.mMetaKeysState=makeMetaState(ev.keycode,

ev.value!=0,di.mMetaKeysState);

mHaveGlobalMetaState=false;

}

}

if(di==null){

continue;

}

if(configChanged){

synchronized(mFirst){

addLocked(di,SystemClock.uptimeMillis(),0,

RawInputEvent.CLASS_CONFIGURATION_CHANGED,

null);

}

}

if(!send){

continue;

}

synchronized(mFirst){

鈥︹€︹€︹€︹€︹€︹€︹€︹€?/span> .

if(type==RawInputEvent.EV_KEY&&

(classes&RawInputEvent.CLASS_KEYBOARD)!=0&&

(scancode<RawInputEvent.BTN_FIRST||

scancode>RawInputEvent.BTN_LAST)){

/*閿洏鎸夐敭浜嬩欢 */

鈥︹€︹€︹€︹€︹€︹€︹€?/span> .

}elseif(ev.type==RawInputEvent.EV_KEY){

/*涓嬮潰鏄?/span> EV_KEY 浜嬩欢鍒嗘敮锛屽彧鏀寔鍗曠偣鐨勮Е鎽稿睆鏈夋寜閿簨浠讹紝

*鑰屾敮鎸佸鐐圭殑瑙︽懜灞忔病鏈夋寜閿簨浠讹紝鍙湁缁濆鍧愭爣浜嬩欢

*/

if(ev.scancode==RawInputEvent.BTN_TOUCH&&

(classes&(RawInputEvent.CLASS_TOUCHSCREEN

|RawInputEvent.CLASS_TOUCHSCREEN_MT))

==RawInputEvent.CLASS_TOUCHSCREEN){

/*鍙敮鎸佸崟鐐圭殑瑙︽懜灞忕殑鎸夐敭浜嬩欢 */

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span>

}elseif(ev.scancode==RawInputEvent.BTN_MOUSE&&

(classes&RawInputEvent.CLASS_TRACKBALL)!=0){

/*榧犳爣鍜岃建杩圭悆 */

鈥︹€︹€︹€︹€︹€︹€︹€︹€?/span> .

}elseif(ev.type==RawInputEvent.EV_ABS&&

(classes&RawInputEvent.CLASS_TOUCHSCREEN_MT)!=0){

/*涓嬮潰鎵嶆槸澶氱偣瑙︽懜灞忎笂鎶ョ殑浜嬩欢 */

if(ev.scancode==RawInputEvent.ABS_MT_TOUCH_MAJOR){

di.mAbs.changed=true;

di.mAbs.mNextData[di.mAbs.mAddingPointerOffset

+MotionEvent.SAMPLE_PRESSURE]=ev.value;

}elseif(ev.scancode==RawInputEvent.ABS_MT_POSITION_X){

di.mAbs.changed=true;

di.mAbs.mNextData[di.mAbs.mAddingPointerOffset

+MotionEvent.SAMPLE_X]=ev.value;

}elseif(ev.scancode==RawInputEvent.ABS_MT_POSITION_Y){

di.mAbs.changed=true;

di.mAbs.mNextData[di.mAbs.mAddingPointerOffset

+MotionEvent.SAMPLE_Y]=ev.value;

}elseif(ev.scancode==RawInputEvent.ABS_MT_WIDTH_MAJOR){

di.mAbs.changed=true;

di.mAbs.mNextData[di.mAbs.mAddingPointerOffset

+MotionEvent.SAMPLE_SIZE]=ev.value;

}

/*涓婇潰杩欐灏辨槸澶氱偣瑙︽懜灞忚鐢ㄥ埌鐨勪簨浠朵笂鎶ラ儴鍒?/span> ;

*浣跨敤涓€涓暟缁?/span> mNextData 鏉ヤ繚瀛橈紝鍏朵腑 di.mAbs.mAddingPointerOffset

*鏄綋鍓嶇偣鐨勫亸绉婚噺锛屽湪姣忎釜鐐逛腑杩樺湪 MotionEvent 涓畾涔変簡 X,Y,PRESSURE

*SIZE绛夊亸绉婚噺锛屽鐐硅Е鎽稿睆鐨勫帇鍔涘€肩敱缁濆鍧愭爣浜嬩欢 ABS_MT_TOUCH_MAJOR 纭畾銆?/span>

*/

}elseif(ev.type==RawInputEvent.EV_ABS&&

(classes&RawInputEvent.CLASS_TOUCHSCREEN)!=0){

/*杩欓噷鏄鍗曠偣瑙︽懜灞忎笂鎶ュ潗鏍囦簨浠剁殑鏂扮殑澶勭悊鏂规硶锛屽悓鏍蜂娇鐢ㄤ簡鏁扮粍鏉ヤ繚瀛?nbsp; */

if(ev.scancode==RawInputEvent.ABS_X){

di.mAbs.changed=true;

di.curTouchVals[MotionEvent.SAMPLE_X]=ev.value;

}elseif(ev.scancode==RawInputEvent.ABS_Y){

di.mAbs.changed=true;

di.curTouchVals[MotionEvent.SAMPLE_Y]=ev.value;

}elseif(ev.scancode==RawInputEvent.ABS_PRESSURE){

di.mAbs.changed=true;

di.curTouchVals[MotionEvent.SAMPLE_PRESSURE]=ev.value;

di.curTouchVals[MotionEvent.NUM_SAMPLE_DATA

+MotionEvent.SAMPLE_PRESSURE]=ev.value;

}elseif(ev.scancode==RawInputEvent.ABS_TOOL_WIDTH){

di.mAbs.changed=true;

di.curTouchVals[MotionEvent.SAMPLE_SIZE]=ev.value;

di.curTouchVals[MotionEvent.NUM_SAMPLE_DATA

+MotionEvent.SAMPLE_SIZE]=ev.value;

}

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span> .}

/*涓嬮潰鏄叧閿殑鍚屾澶勭悊鏂规硶 */

if(ev.type==RawInputEvent.EV_SYN

&&ev.scancode==RawInputEvent.SYN_MT_REPORT

&&di.mAbs!=null){

/*鍦ㄨ繖閲屽疄鐜颁簡瀵?/span> SYN_MT_REPORT 浜嬩欢鐨勫鐞嗭紝

*鏀瑰彉浜?/span> di.mAbs.mAddingPointerOffset 鐨勫€硷紝浠庤€屽皢

*鏂板鐨勭偣鐨勫弬鏁颁繚瀛樺埌涓嬩竴缁勫亸绉婚噺鐨勪綅缃€?/span>

*/

鈥︹€︹€︹€︹€︹€︹€︹€?/span> .

finalintnewOffset=(num<=InputDevice.MAX_POINTERS)

?(num*MotionEvent.NUM_SAMPLE_DATA)

:(InputDevice.MAX_POINTERS*

MotionEvent.NUM_SAMPLE_DATA);

di.mAbs.mAddingPointerOffset=newOffset;

di.mAbs.mNextData[newOffset

+MotionEvent.SAMPLE_PRESSURE]=0;

}

鈥︹€︹€︹€︹€︹€?/span> .

}elseif(send||(ev.type==RawInputEvent.EV_SYN

&&ev.scancode==RawInputEvent.SYN_REPORT)){

/*杩欓噷瀹炵幇浜嗗 SYN_REPORT 浜嬩欢鐨勫鐞?/span>

*濡傛灉鏄崟鐐硅Е鎽稿睆锛屽嵆浣跨敤 di.curTouchVals 鏁扮粍淇濆瓨鐨勭偣

*杞寲涓哄鐐硅Е鎽稿睆鐨?/span> mNextData 鏁扮粍淇濆瓨

*鏈€鍚庢槸璋冪敤 InputDevice 涓殑 generateAbsMotion 澶勭悊杩欎釜鏁扮粍銆傝繖涓嚱鏁?/span>

*鐨勫叿浣撳疄鐜版柟娉曞皢鍦ㄥ悗闈㈣ˉ鍏?/span>

*/

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span> ..

ms.finish(); //閲嶇疆鎵€鏈夌偣鍜屽亸绉婚噺

鈥︹€︹€︹€︹€︹€︹€︹€?/span> ..

}

鐢变簬涓婂眰鐨勪唬鐮佷粛鐒朵娇鐢?span style="font-family: Times New Roman;">ABS_X,ABS_Y 杩欎簺浜嬩欢锛屼负浜嗕娇澶氱偣瑙︽懜灞忎唬鐮佹湁鑹ソ鐨勫吋瀹规€э紝鍦?/span> KeyInputQueue.java 鐨勬渶鍚庯紝鎴戜滑灏嗗鐐逛簨浠剁被鍨嬭浆鍖栦负鍗曠偣浜嬩欢绫诲瀷锛岃繑鍥炰竴涓柊鐨?/span> InputDevice:

privateInputDevicenewInputDevice(intdeviceId){

intclasses=getDeviceClasses(deviceId);

Stringname=getDeviceName(deviceId);

InputDevice.AbsoluteInfoabsX;

InputDevice.AbsoluteInfoabsY;

InputDevice.AbsoluteInfoabsPressure;

InputDevice.AbsoluteInfoabsSize;

if((classes&RawInputEvent.CLASS_TOUCHSCREEN_MT)!=0){

absX=loadAbsoluteInfo(deviceId,

RawInputEvent.ABS_MT_POSITION_X,"X");

absY=loadAbsoluteInfo(deviceId,

RawInputEvent.ABS_MT_POSITION_Y,"Y");

absPressure=loadAbsoluteInfo(deviceId,

RawInputEvent.ABS_MT_TOUCH_MAJOR,"Pressure");

absSize=loadAbsoluteInfo(deviceId,

RawInputEvent.ABS_MT_WIDTH_MAJOR,"Size");

}elseif((classes&RawInputEvent.CLASS_TOUCHSCREEN)!=0){

absX=loadAbsoluteInfo(deviceId,

RawInputEvent.ABS_X,"X");

absY=loadAbsoluteInfo(deviceId,

RawInputEvent.ABS_Y,"Y");

absPressure=loadAbsoluteInfo(deviceId,

RawInputEvent.ABS_PRESSURE,"Pressure");

absSize=loadAbsoluteInfo(deviceId,

RawInputEvent.ABS_TOOL_WIDTH,"Size");

}else{

absX=null;

absY=null;

absPressure=null;

absSize=null;

}

returnnewInputDevice(deviceId,classes,name,absX,absY,absPressure,absSize);

}


绗洓绔?/span> 瑙︽懜浜嬩欢 鏁扮粍鐨勫鐞?/span>

涓婇潰鎴戜滑鏇捐鍒?/span> generateAbsMotion 杩欎釜鏂规硶锛屽畠浠湪InputDevice 绫荤殑鍐呴儴绫?/span> MotionState 涓疄鐜帮紝璇ョ被琚畾涔変负 InputDevice 绫荤殑闈欐€佹垚鍛樼被 (staticclass) 锛岃皟鐢ㄥ畠浠彲浠ョ洿鎺ヤ娇鐢細

InputDeviceClass.MotionStateClass.generateAbsMotion()銆?/span>

publicclassInputDevice{

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span>

staticclassMotionState{ //涓嬮潰鏄繖涓唴閮ㄧ被鐨勫嚑涓嚱鏁?/span>

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span> .

/*mLastNumPointers涓轰笂涓€涓姩浣滃湪瑙﹀睆涓婃寜閿殑涓暟 */

intmLastNumPointers=0;

finalint[]mLastData=newint[MotionEvent.NUM_SAMPLE_DATA*MAX_POINTERS];

/*mNextNumPointers涓轰笅涓€涓姩浣滃湪瑙﹀睆涓婃寜閿殑涓暟 */

/*閫氳繃瀵硅繖 2 涓€煎ぇ灏忕殑鍒ゆ柇锛屽彲浠ョ‘璁ゆ柊鐨勫姩浣滄柟寮?nbsp; */

intmNextNumPointers=0;

finalint[]mNextData=newint[(MotionEvent.NUM_SAMPLE_DATA*MAX_POINTERS)

+MotionEvent.NUM_SAMPLE_DATA];

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span> .

int[]generateAveragedData(intupOrDownPointer,intlastNumPointers,

intnextNumPointers){ //骞虫粦澶勭悊

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span> .

}

privatebooleanassignPointer(intnextIndex,booleanallowOverlap){ //鎸囨淳鎸夐敭

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span>

}

privateintupdatePointerIdentifiers(){ //鏇存柊鎸夐敭 ID

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span> .

}

voidremoveOldPointer(intindex){

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span>

}

MotionEventgenerateAbsMotion(InputDevicedevice,longcurTime,

longcurTimeNano,Displaydisplay,intorientation,

intmetaState){

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span>

intupOrDownPointer=updatePointerIdentifiers();

finalintnumPointers=mLastNumPointers;

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span>

/*瀵硅涓虹殑鍒ゆ柇 */

if(nextNumPointers!=lastNumPointers){ //鍓嶅悗鍦ㄨЕ灞忎笂鐐逛釜鏁颁笉鍚岋紝璇存槑鏈夋墜鎸?/span> up 鎴?/span> down

if(nextNumPointers>lastNumPointers){

if(lastNumPointers==0){ //涓婃瑙﹀睆涓婃病鏈夋寜閿紝鏂板€煎張澶э紝璇存槑鏈夋寜閿寜涓?/span>

action=MotionEvent.ACTION_DOWN;

mDownTime=curTime;

}else{ //鏈夋柊鐐规寜涓嬶紝鍒嗛厤缁欐柊鐐?/span> ID 鍙?/span>

action=MotionEvent.ACTION_POINTER_DOWN

|(upOrDownPointer<<MotionEvent.ACTION_POINTER_ID_SHIFT);

}

}else{ //鏂板姩浣滄瘮鍘熸潵 pointer 鏁伴噺灏?/span>

if(numPointers==1){ //鍘熸潵鍙湁 1 涓偣鎸変笅锛屾墍浠ョ幇鍦ㄧ殑鍔ㄤ綔鏄叏閮ㄦ寜閿?/span> up

action=MotionEvent.ACTION_UP;

}else{ //鍘熸潵鏈夊鐐规寜涓嬶紝鐜板湪鏄?/span> ACTION_POINTER_UP 鍔ㄤ綔锛?/span>

action=MotionEvent.ACTION_POINTER_UP

|(upOrDownPointer<<MotionEvent.ACTION_POINTER_ID_SHIFT);

}

}

currentMove=null;

}else{ //鍓嶅悗瑙﹀睆 pointer 涓暟鐩稿悓锛屾墍浠ユ槸绉诲姩鍔ㄤ綔 ACTION_MOVE

action=MotionEvent.ACTION_MOVE;

}

/*鍚庨潰鍒欐槸鏍规嵁灞忓箷鐨?/span> height 鍜?/span> width 浠ュ強灞忓箷鏂瑰悜 orientation 瀵硅繖浜涚偣杩涜浜屾澶勭悊*/

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span>

}

MotionEventgenerateRelMotion(InputDevicedevice,longcurTime,

longcurTimeNano,intorientation,intmetaState){

/*杞ㄨ抗鐞冪瓑鐨勫鐞嗘柟寮?nbsp; */

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span> ..

}

voidfinish(){ //缁撴潫杩欒疆鍔ㄤ綔

mNextNumPointers=mAddingPointerOffset=0;

mNextData[MotionEvent.SAMPLE_PRESSURE]=0;

}

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span> .

}

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span> .

鈥︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€︹€?/span>

}

绗簲绔?/span> 鎺ュ彛

鎴戜滑骞虫椂鎵€鐪嬪埌鐨勭敤2 涓墜鎸囧鍥剧墖鏀惧ぇ缂╁皬銆佹棆杞瓑鎵嬪娍閮芥槸鐢卞簲鐢ㄧ▼搴忕紪鍐欐祻瑙堝櫒瀹炵幇鐨勩€傝繖浜涘簲鐢ㄧ▼搴忓ぇ澶氫細浣跨敤 Android2.0 浠ヤ笂鐨勫湪 MotionEvent.java 涓疄鐜扮殑鏂扮殑鎺ュ彛銆傛墍浠ワ紝鎴戜滑杩橀渶瑕佺粰 MotionEvent 绫昏ˉ鍏呭敖閲忓叏鐨勬帴鍙c€傝繖閲屽彲浠ュ畬鍏ㄥ弬鐓?/span> google 鏂扮殑 android 浠g爜銆?/span>

绗叚绔?/span> 鎬荤粨

缁间笂锛屽湪纭欢鏀寔鍩虹涓婏紝Android1.6 濡傛灉瑕佸疄鐜板鐐硅Е鎽稿姛鑳斤紝涓昏宸ヤ綔鍙畝杩颁负浠ヤ笅鍑犱釜鏂归潰锛?/span>

1銆?nbsp; 椹卞姩涓紝闄や簡澧炲姞澶氱偣鐨勪簨浠朵笂鎶ユ柟寮忥紝杩樿瀹屽叏鏇存敼鍗曠偣鐨勪簨浠朵笂鎶ユ柟寮忋€?/span>

2銆?nbsp; Android鐨?/span> Frameworks 灞傞渶瑕佷慨鏀圭殑鏂囦欢鏈夛細 EventHub.cpp 锛?/span> RawInputEvent.java 锛?/span> KeyInputQueue.java 锛?/span> InputDevice.java 锛?/span> MotionEvent.java 銆?/span>

3銆?nbsp; 缂栧啓鏂扮殑鏀寔澶氱偣瑙︽懜鍔熻兘鐨勫濯掍綋娴忚鍣ㄣ€?/span>

4銆?nbsp; 涓轰簡浠g爜绠€缁冿紝android2.0 鍦ㄨ建杩圭悆鍜屽崟鐐瑰睆浜嬩欢鏂瑰紡涓篃鍏ㄤ娇鐢ㄤ簡鏂扮殑鍙橀噺鍚嶏紝浠ユ柟渚垮鐐瑰睆浜嬩欢鍚屾牱鑳戒娇鐢ㄨ繖浜涘彉閲忥紝鎵€浠ヤ慨鏀规椂杩橀渶瑕佹敞鎰忚澶氱粏鑺傛柟闈€?/span>

更多相关文章

  1. 代码中设置drawableleft
  2. android 3.0 隐藏 系统标题栏
  3. Android开发中activity切换动画的实现
  4. Android(安卓)学习 笔记_05. 文件下载
  5. Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
  6. 技术博客汇总
  7. android 2.3 wifi (一)
  8. AndRoid Notification的清空和修改
  9. Android中的Chronometer

随机推荐

  1. Android控件GridView的使用
  2. Android——TV真机调试apk(android:shared
  3. Android(安卓)自定义TextView 实现文本间
  4. Bing Maps Android(安卓)SDK Released
  5. android获取GPS位置信息
  6. android:layout_gravity="bottom"不起作
  7. 《Android开发从零开始》——13.Table La
  8. PreferenceActivity和PreferenceFragment
  9. Android实现数据存储技术
  10. 关于Android(安卓)横竖屏切换(避免Activit