Android澶氱偣瑙︽懜鐨勫疄鐜?(杞?
杞浇锛氭湰鏂囧嚭鑷?鈥滅偢姘寸敓鑿?鈥?鍗氬: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>
更多相关文章
- 代码中设置drawableleft
- android 3.0 隐藏 系统标题栏
- Android开发中activity切换动画的实现
- Android(安卓)学习 笔记_05. 文件下载
- Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
- 技术博客汇总
- android 2.3 wifi (一)
- AndRoid Notification的清空和修改
- Android中的Chronometer