使用AccessibilityService模擬點擊事件的方法:
AccessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
但是前提是這個AccessibilityNodeInfo具有Onclick能力,也就是isClickable()為true。
問題在於控件的點擊效果不一定非得通過onClick方法實現,也可以通過onTouchEvent方法實現。當通過onTouchEvent方法實現的時候,就無法通過AccessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK)方法模擬這個控件的點擊事件了。
一、點擊效果通過onClick方法實現
id_btn_openFloatWindow.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.i("onClick", "onClick"); } });
二、點擊效果通過onTouchEvent方法實現
id_btn_openFloatWindow.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { onTouchEvent(event,v); return true;//改為true,則不會觸發OnClick方法 } });
private boolean onTouchEvent(MotionEvent event, View view) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.i("onTouchEvent", "ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: Log.i("onTouchEvent", "ACTION_UP"); break; } return true; }
如果采用OnTouchEvent方法實現點擊事件並且沒有做到和輔助功能兼容,那么也就無法通過onTouchEvent模擬該控件的點擊事件了。
===================================================================
onTouchEvent方法實現與輔助性服務保持兼容性的解決方案:
- 生成一個接近解釋AccessibilityEvent的點擊動作。
- 對不能使用觸摸屏的用戶提供自定義點擊動作的輔助性服務。
class CustomTouchView extends View { public CustomTouchView(Context context) { super(context); } boolean mDownTouch = false; @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); // Listening for the down and up touch events switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mDownTouch = true; return true; case MotionEvent.ACTION_UP: if (mDownTouch) { mDownTouch = false; performClick(); // Call this method to handle the response, and // thereby enable accessibility services to // perform this action for a user who cannot // click the touchscreen. return true; } } return false; // Return false for other touch events } @Override public boolean performClick() { // Calls the super implementation, which generates an AccessibilityEvent // and calls the onClick() listener on the view, if any super.performClick(); // Handle the action for the custom click here return true; } }
上面所示的模式通過調用performClick()方法確保了自定義點擊事件是與輔助性服務兼容的,performClick()方法既生成一個輔助性事件,又提供一個訪問輔助性服務的入口,來代表用戶執行了自定義的點擊事件。
參考資料:
http://www.xuebuyuan.com/2061597.html