コンフリクト
Androidの開発では、我々は常に話題を避けることができない競合をスライディング。液として混合されます。例えばRecyclerViewは、直接相関法の禁止によってRecyclerView内側スライド、RecyclerViewを入れ子; ScrollView RecyclerViewネストを直接ようNestedScrollView ScrollViewとして置き換えられます。
しかし、我々は今日はカスタムビューのスライドの競合に遭遇したとき、どのように我々はそれに対処すべきであるということであると言っていますか?もちろん、今日の話題ビューイベント分配機構は、理論的な前提を行う必要があります。
1.簡単なビューイベント分配機構
もちろん、単にここで言及、基本的な流れは次の擬似コードです。
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;
if (onInterceptTouchEvent(ev)) {
consume = onTouchEvent(ev);
}else{
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
ViewGroupイベント、最初の呼び出し受信した場合dispatchTouchEvent
、イベント分布の()メソッドがあれば、onInterceptTouchEvent
()がtrueを返し、現在のビューは、直接コールバックイベントをインターセプトします表すonTouchEvent
イベント処理の()メソッド。
傍受されていない場合、ダイレクトコールバックの子のビューdispatchTouchEvent
()メソッド。だから、再び、最も内側のサブビューにすべての方法。
クリックイベントが発生すると、順次その伝達プロセス:Activity => Window => View
最初のイベントは、常に活動に渡されることが、活動は、最終的なトップDecorViewに渡される前に、ウィンドウをウィンドウを通過し、その後、上記のようにビューの最内層にあった従ってください。
何も表示されますが、直接背中の活動に、そこに処理されていない場合は、その外側の表示を継続する最内層ビューバックからハンドルのイベント。
自らのための真に対処するonTouchEvent()を返します。
彼らは少し置くので、私は突然、参照の芸術を探求するには、Android開発者からいくつかの結論を与えたいです。
イベントの1と同じシーケンスが指からのものである(タッチスクリーン
ACTION_DOWN
画面から離れた瞬間に)、指(ACTION_UP
エンド)現時点では、可変数を含む中央にACTION_MOVE
イベント。
ビューイベント、それだけで処理できるイベントのシーケンスを傍受することを決定したら2、およびそれのonInterceptTouchEvent
()メソッドが再び呼び出されません。すなわち、このようなAにViewGroup
複数のサブビュー、一旦ACTION_DOWN
イベントは、切片からのViewGroupアクティビティーにそのようなMOVE用UPとして後続のイベントが渡され、サブ表示の内部に伝達されません。
3.場合はView
、それは消費しない場合にはすぐに、イベントの処理を開始ACTION_DOWN
するイベント、すなわちonTouchEventを()はfalseを返し、その後、イベントの同じシーケンスで他のイベントは、もはやそれと呼ばれます直接onTouchEvent(の親ビューを呼び出していません) 。
また4. Viewは消費しないならばACTION_DOWN
、それは呼び出されません、もちろんビューイベントは、フォローアップ、最終的には消失クリックイベントを受信し続ける場合があります)(、その後、クリックイベントが消え、この時点onTouchEvent親要素を他のイベントの外側をアクティビティは、プロセスに渡されます。デフォルトでは、イベント、遮らないノーイベントが渡された後()メソッド、直接呼び出します)(デフォルトはイベントから消費されます。それがクリックされていないされていない場合(つまり、クリック可能とlongClickableはfalseです)。ビュー既定値はfalseであり、ポイント状況は、ボタンのデフォルトがtrueであるような、TextViewのデフォルトはfalseです。ViewGroup
View
onInterceptTouchEvent
onTouchEvent
longClickable
clickable
6. プロパティは影響しませんが()ビューがある限り、それはクリッカブルを持っているかlongClickableが真であるとして、ディスエーブル状態であっても、デフォルト値を返し、それは本当の()を返しますonTouchEvent。7. ()あなたは、イベント配信プロセス内の親要素の子要素に介入することができますが、ACTION_DOWNイベントに介入することはできません。8.イベントの優先順位:View
enable
onTouchEvent
requestDisallowInterceptTouchEvent
setOnTouchListener() => onTouchEvent() => onClickListener()
偶然もちろん、これらは結論している、たくさんのまだ発見しました。
競合をスライド2.表示のカスタマイズ方法
ほとんどのAndroid開発者のために、プロセスが競合をスライドすることは困難と思われるが、それはまた、その戦闘を発見した事実がフォローするルーチンがあることから、それは、非常に単純なようです。基本的に2つのオプション:外部法律&&内部インターセプト法を傍受します。
2.1外部インターセプト法
いわゆる外部インターセプト法、名前が示すように、直接である親コンテナの直接傍受当社スリップイベントの外に、それはそう、サブ要素に入ることを許されない、と我々はRecyclerViewネスティングはRecyclerView
、つまり、トレースの類似点があるの内側に無効RecyclerViewスライドであります事を完了するためには内部プロセスません。しかし、注意してください、とは全く異なる製品、外部インターセプト法は、単純にスライドイベントを受信しません、ここで内部素子を行います。
この方法では、我々はそれについて話している、明らかにイベント配信メカニズムのために非常に適しています。私たちは受けているACTION_MOVE
が直接タイムイベントをonInterceptTouchEvent
確実に知ることでイベントオフ直接傍受に真()メソッドが返す、擬似コード:
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
ev?.run {
if (action == MotionEvent.ACTION_MOVE && 父容器需要点击事件){
return true
}
}
return super.onInterceptTouchEvent(ev)
}
コードは非常に簡単です、私達はちょうど私たちは時間のロジックを満たすとき、彼らは自分自身に対処するためのACTION_MOVEイベントをオフに傍受そのようなイベントACTION_MOVE中で私たちのロジックを処理する必要があります。
ACTION_DOWNとACTION_UP遮らない理由については、確かにそれはオフにします。その上で、傍受した場合はACTION_DOWN
イベント、およびそのフォローアップACTION_MOVE、ACTION_UP
および他のイベントを呼び出していませんonInterceptTouchEvent
()メソッドは、直接、現在のコンテナ取扱に引き渡されます。ACTION_UPオフ我々切片は、その後、確かにサブ要素のクリックイベントにつながる場合、私はあなたがいることをすべて知っていますので処理できませんACTION_DOWNからのクリックイベントがACTION_UP端から開始し、両方が不可欠です。
2.2内部インターセプト法
内部インターセプト法は、比較的、我々は一般的に言って、私たちは外部のインターセプト法でより多くの推奨処置である、外部傍受祭式を複雑化されます。しかし、法律はまだ、非常に重要な位置にその内部の切片を持っている状況が発生することがあります。
内部傍受法、そして、必要性requestDisallowInterceptTouchEvent
支援()メソッドは、このメソッドは、それをしているのですか?名前が示唆するように、要求をイベントインターセプトを許可されていないかどうかを受信boolean
切片を許可か否かを示すパラメータ。
我々は、上書き指示サブ要素dispatchTouchEvent
擬似コードを取得する()メソッドを以下のとおりです。
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
ev?.run {
when(action){
MotionEvent.ACTION_DOWN -> parent.requestDisallowInterceptTouchEvent(true)
MotionEvent.ACTION_MOVE ->{
if(满足需要让外部容器拦截事件){
parent.requestDisallowInterceptTouchEvent(false)
}
}
}
}
return super.dispatchTouchEvent(ev)
}
おそらくコードを理解することは非常に簡単でもあり、私たちは親コンテナを与えるrequestDisallowInterceptTouchEvent
()渡されたパラメータは、パラメータが真の代表がfalseの場合は代表者の傍受として、切片に許可されていないときに、インターセプトイベントを許可するか否かを表します。だから、まったく同じに見えますし、また、外部の傍受法。
しかし、単にこの点を修正するのに十分な存在ではありません、私たちは私たちの親血管がオフに傍受されなかったときに、以前の理論的基礎を通じて知っているACTION_DOWN
すべてのイベントがもはや当然、サブ要素に配信されたときに、イベントを、それが上記の私たちの書き込みを呼び出すことはありませんdispatchTouchEvent
()メソッドを有します。私たちは親コンテナ書き換えに必要な時間内に、法律を傍受だから、onInterceptTouchEvent
()メソッドを。
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
ev?.run {
if (action == MotionEvent.ACTION_DOWN){
return false
}
}
return super.onInterceptTouchEvent(ev)
}
したがって、実際のシーンと組み合わせたカスタムビュー内の処理液の紹介、基本的な2つのスライド競合は、便利になります。
資料では、発生した問題に言及しましたか?それはどのように解決するのですか?
最後に、学ぶためのプログラマー、コンテンツの知識のために、自分自身を向上させるだけ排除すべきでない、あまりにも多くの技術的、環境的順序があり、常に私たちは環境ではなく、私たちに適応する環境に適応するためには!
ここでのセットの数十に関連した上記技術的システム図添付の質問は、19年テンセント、見出し、アリ、米国のグループと他の企業が直面している技術は、終点のビデオとPDF(実際には、予想以上に多くの時間を費やす)となっており、含む知識のコンテキスト+多くの詳細ここではあなたにそれの一部を表示する絵の形で、紙面の都合で、。
私はそれがあなたの収穫の多くをもたらすと信じて:
[上記のHD脳図]、および私を追加することができ、[サポート] PDF技術アーキテクチャは、WX:X1524478394の無料アクセスを
ときに簡単にプログラマ、優れたプログラマがシニアアーキテクトへのプライマリから上級プログラマー、建築家にジュニアプログラマから学ぶ必要があるとき、または技術的な管理から管理、テクニカルディレクターの各段階に私たちは、さまざまな機能を持っている必要があります。初期の研究では、キャパシティビルディングで仲間を投げるためには、自分のキャリアの方向性を決定します。