功能:長按系統默認進入文字選擇默認,實現先長按菜單顯示菜單同能菜單選項來判斷是否進行的進入自由復制文本文字選擇的操作。
一、長按顯示彈出菜單,可怎么才在能實現點擊菜單選擇進入自由復制文本模式呢?在網上翻了個遍,都不怎么如意,糾結了幾日,下午偷懶睡了一覺突然就想到了模擬長按操作觸發默認的顯示復制菜單
實現模擬長按操作實現類
/**?
?*?模擬點擊事件和長按事件?
?*?
?*/??
??
public?class?TouchEventRunnable?implements?Runnable?{??
????private?int?x;??
????private?int?y;??
??
????private?boolean?isLongPress;??
??
????public?TouchEventRunnable(int?x,?int?y)?{??
????????this.x?=?x;??
????????this.y?=?y;??
????}??
????public?TouchEventRunnable(int?x,?int?y,?boolean?isLongPress)?{??
????????this.x?=?x;??
????????this.y?=?y;??
????????this.isLongPress?=?isLongPress;??
????}??
??
????@Override??
????public?void?run()?{??
????????if(isLongPress){??
????????????longClickOnScreen(x,y);??

????????}else{??
????????????onClick();??
????????}??
????}??
??
??
????private?void?longClickOnScreen(int?x,?int?y)?{??
????????final?Instrumentation?inst?=?new?Instrumentation();??
????????try?{??
????????????long?downTime?=?SystemClock.uptimeMillis();??
????????????long?eventTime?=?SystemClock.uptimeMillis();??
????????????final?MotionEvent?eventDown?=?MotionEvent.obtain(downTime,??
????????????????????eventTime,?MotionEvent.ACTION_DOWN,?x,?y,?0);??
????????????eventDown.setSource(InputDevice.SOURCE_TOUCHSCREEN);??
????????????final?MotionEvent?eventMove?=?MotionEvent.obtain(downTime,?eventTime,??
????????????????????MotionEvent.ACTION_MOVE,?x,?y+1,?0);??
????????????eventMove.setSource(InputDevice.SOURCE_TOUCHSCREEN);??
????????????final?MotionEvent?eventUp?=?MotionEvent.obtain(downTime,?eventTime,??
????????????????????MotionEvent.ACTION_UP,?x,?y,?0);??
????????????eventUp.setSource(InputDevice.SOURCE_TOUCHSCREEN);??
????????????inst.sendPointerSync(eventDown);??
????????????inst.sendPointerSync(eventMove);??
????????????try?{??
????????????????Thread.sleep(650);??
????????????}?catch?(InterruptedException?e)?{??
????????????????e.printStackTrace();??

????????????}??
????????????inst.sendPointerSync(eventUp);??
????????}?catch?(NullPointerException?e)?{??
????????????e.printStackTrace();??
????????}??
????}??
??
??
??
????private?void?onClick(){??
??
????????Instrumentation?inst?=?new?Instrumentation();??
????????inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),?SystemClock.uptimeMillis(),??
????????????????MotionEvent.ACTION_DOWN,?x,?y,?0));??
????????inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),?SystemClock.uptimeMillis(),??
????????????????MotionEvent.ACTION_UP,?x,?y,?0));??
????????//Log.v("LOG",?"?x?=?"?+?x?+?"?y?=?"?+?y);??
??
????}??
}??
二、接下來是長按先要顯示的菜單代碼
public?void?showMenu(View?v){??
???????Activity?mContext?=?this;??
???????android.app.FragmentTransaction?mFragTransaction?=?mContext.getFragmentManager().beginTransaction();??
???????android.app.Fragment?fragment?=??mContext.getFragmentManager().findFragmentByTag("dialogFragment");??
???????if(fragment!=null){??

???????????mFragTransaction.remove(fragment);??
???????}??
??
???????ListDialogFragment?dialogFragment?=?ListDialogFragment.newInstance("bookmarkFragment");??
???????dialogFragment.setWidthPercent(0.38f,0.38f);??
??
??
???????focusedRawPosition?=?((WebViewCopyText)?v).getTouchLocation();??
???????dialogFragment.optimzeLocation(v,focusedRawPosition);??
??
???????dialogFragment.setGravityAndXY(Gravity.LEFT|Gravity.TOP,?focusedRawPosition[0],focusedRawPosition[1]);??
???????String[]?menuStrs?=?new?String[]{"自由復制","復制連接","分享網頁"};??
???????dialogFragment.setListData(menuStrs);??
???????dialogFragment.setIsEnaledGravityAndXY(true);??
???????dialogFragment.setOnListDialogItemClickListener(new?ListDialogFragment.OnListDialogItemClickListener()?{??
???????????@Override??
???????????public?void?onClick(int?position)?{??
???????????????webView.getHandler().postDelayed(new?Runnable()?{??
???????????????????@Override??
???????????????????public?void?run()?{??
??
???????????????????????//先清空長按監聽避免再次顯示菜單,再聽定時回調設置回來??
???????????????????????webView.setOnLongClickListener(null);??
??
???????????????????????//執行點擊事件??
???????????????????????new?Thread(new?TouchEventRunnable(focusedRawPosition[0],focusedRawPosition[1]+getStateBarHeight(),true)).start();??

??
???????????????????????webView.getHandler().postDelayed(new?Runnable()?{??
???????????????????????????@Override??
???????????????????????????public?void?run()?{??
???????????????????????????????webView.setOnLongClickListener(onLongClickListener);??
??
???????????????????????????}??
???????????????????????},2500);??
??
???????????????????}??
???????????????},100);??
??
???????????}??
???????});??
??
??
???????dialogFragment.show(mFragTransaction,?"dialogFragment");//顯示??
??
??
???}??
上面的代碼主要是實現模擬長按操作進入自由復制文字選擇模式。
在實際操作發現不管是模擬觸發的還是默認的,在同一個網頁中有時可以進入文字選擇默認,有時則不能,甚至有的網頁怎么也無法進入。
通過瀏覽器調試,發現能進入復制文字選擇魔的往往是HTML的h1~h6,span,p之類的元素,凡是長按a元素沒有一個網頁能進入自由復制模式的,再次對a原始的各個屬性進行排查問題出在a元素的href屬性上。
結果是:
當HTML上的a元素設置了href屬性時無法無法進入自由復制模式android 模擬長按事件,但當a元素沒有設置設置href屬性時,則可以進入。
這用js的方法.('href');把HTML上的所有的a元素的href屬性移除掉android 模擬長按事件,又可以進文字選擇模式。
下面是js移除href屬性的代碼.
/**?
開始選擇文字是去除a標簽的href屬性?
**/??
function?startSelectText(){??
????var?ass?=?document.getElementsByTagName('a');??
??
????for(var?i?=?0;?i?
-END