によって受信MotionEvent
のgetPointerCount()
の合計値を記録しますすべてのタッチイベントが傍受されるカスタムViewGroup。
あなたは、Androidでこの作品を理解する必要があります。
ViewGroup.onInterceptTouchEvent(MotionEvent)
は、彼らが子供たちに到達する前のViewGroupがタッチイベントをインターセプトすることができます。 true
をここに返すとonTouchEvent()
に次のタッチイベントが届き、現在のイベントが終了するまで(ポインターが削除されるまで)子どもはもうタッチイベントを受信しません。
- 子供の見解では、迎え入れを拒否する親に
ViewGroup.requestDisallowInterceptTouchEvent(boolean)
彼らは進行中のタッチイベントを認識し、彼らがそれを中断することを望んでいません。 ViewGroupがこの要求を受信した場合には、親に渡して、それを尊重しなければならない(=ここでは上からイベントをインターセプトしません)
- 内部
ViewGroup
はrequestDisallowInterceptTouchEvent(true)
後onInterceptTouchEvent
を呼び出すことはありませんあなたがする必要がある場合は
を受信しますすべてのタッチイベントを聴いてください。たとえ子供が傍受を許可しなくても、ViewGroup
はそれが許可されていないと思って騙す必要がありますが、依然として拒否を尊重する必要があります(タッチイベントを傍受しないでください)。
これは私がまさにその私のプロジェクトの1のために書いたクラスです:あなただけで、あなたのリスナーを設定し
public class InterceptTouchFrameLayout extends FrameLayout {
private boolean mDisallowIntercept;
public interface OnInterceptTouchEventListener {
/**
* If disallowIntercept is true the touch event can't be stealed and the return value is ignored.
* @see android.view.ViewGroup#onInterceptTouchEvent(android.view.MotionEvent)
*/
boolean onInterceptTouchEvent(InterceptTouchFrameLayout view, MotionEvent ev, boolean disallowIntercept);
/**
* @see android.view.View#onTouchEvent(android.view.MotionEvent)
*/
public boolean onTouchEvent(InterceptTouchFrameLayout view, MotionEvent event);
}
private static final class DummyInterceptTouchEventListener implements OnInterceptTouchEventListener {
@Override
public boolean onInterceptTouchEvent(InterceptTouchFrameLayout view, MotionEvent ev, boolean disallowIntercept) {
return false;
}
@Override
public boolean onTouchEvent(InterceptTouchFrameLayout view, MotionEvent event) {
return false;
}
}
private static final OnInterceptTouchEventListener DUMMY_LISTENER = new DummyInterceptTouchEventListener();
private OnInterceptTouchEventListener mInterceptTouchEventListener = DUMMY_LISTENER;
public InterceptTouchFrameLayout(Context context) {
super(context);
}
public InterceptTouchFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InterceptTouchFrameLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
getParent().requestDisallowInterceptTouchEvent(disallowIntercept);
mDisallowIntercept = disallowIntercept;
}
public void setOnInterceptTouchEventListener(OnInterceptTouchEventListener interceptTouchEventListener) {
mInterceptTouchEventListener = interceptTouchEventListener != null ? interceptTouchEventListener : DUMMY_LISTENER;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean stealTouchEvent = mInterceptTouchEventListener.onInterceptTouchEvent(this, ev, mDisallowIntercept);
return stealTouchEvent && !mDisallowIntercept || super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean handled = mInterceptTouchEventListener.onTouchEvent(this, event);
return handled || super.onTouchEvent(event);
}
}
:そのリスナーの中にview.setOnInterceptTouchEventListener()
あなたはダウンポインタのカウントを保持することができます(onIntercetTouchEvent()
メソッド内)。 そのレイアウトをレイアウトのルート(全画面)として配置するだけです。
あなたがすべてのタッチイベントを受け取ることが許可されていないため、不正行為を行わずに同じことをしようとすると、間違った情報に終わる可能性があります。
すべてのビューは、ViewGroup内にルートビューとして存在します。 ViewGroupクラスにはメソッド['onInterceptTouch()'](https://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent))があります。あなたがそれから虚偽を返す限り、イベントはそれを通過し、次に子ビューに渡されます。したがって、理論的には、Viewsの親ViewGroupはすべてのポインタを監視できます。テストする必要があるのは確かです。 –