scrollview 與自定義view 一起使用衝突問題
阿新 • • 發佈:2019-02-05
開發過程中會發現scrollview 與自定義view 一起使用時,自定義view有左右或者上下滑動功能時,會有衝突,也就是說自定義view的觸控時間失效了,這是因為android機制預設父view的觸控優先級別高(如有錯歡迎指正),那麼如何解決呢,通過學習前輩高手的程式碼我們只要重寫我們自定義view的觸控時間就可以了:
int mPosX,mPosY,mCurrentPosX,mCurrentPosY;
mDocView.setOnTouchListener(new View.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: mPosX = (int)event.getX(); mPosY = (int)event.getY(); Log.d("mCurrentPosX", "按下位置"+mPosX+"移動位置"); frgtChDetailScroll.getParent().requestDisallowInterceptTouchEvent(true); caseMotionEvent.ACTION_MOVE: //表示父類需要 mCurrentPosX = (int)event.getX()-mPosX; mCurrentPosY = (int)event.getY()-mPosY; mPosX = (int)event.getX(); mPosY = (int)event.getY(); Log.d("mCurrentPosX", "mCurrentPosX位置"+mCurrentPosX+"mPosX位置"+mPosX); Log.d("mCurrentPosX", "mCurrentPosY位置"+mCurrentPosY+"mPosX位置"+mPosY); if (mCurrentPosX > 0 ) { v.getParent().requestDisallowInterceptTouchEvent(true); Log.d("mCurrentPosX", "向右的按下位置"+mPosX+"移動位置"+mCurrentPosX); } else if (mCurrentPosX < 0 ) { v.getParent().requestDisallowInterceptTouchEvent(true); Log.d("mCurrentPosX", "向左的按下位置"+mPosX+"移動位置"+mCurrentPosX); } else if (mCurrentPosY > 0 ) { v.getParent().requestDisallowInterceptTouchEvent(false); // Logger.d( "向下的按下位置"+mPosX+"移動位置"+mCurrentPosX); Log.d("mCurrentPosX", "向下的按下位置"+mPosX+"移動位置"+mCurrentPosX); } else if (mCurrentPosY < 0 ) { v.getParent().requestDisallowInterceptTouchEvent(false); Log.d("mCurrentPosX", "向上的按下位置"+mPosX+"移動位置"+mCurrentPosX); } case MotionEvent.ACTION_UP: frgtChDetailScroll.getParent().requestDisallowInterceptTouchEvent(true); default: break; }
// 判斷自定義view是否空的邏輯,對自定義view進行焦點獲取設定,mDocView是我的自定義view, if(buffer==null){ }else {
mDocView.setFocusable(true); mDocView.setFocusableInTouchMode(true); mDocView.requestFocus(); } return false; } });