5

に実装GestureDetectorしましたActivity。現在onSingleTapConfirmed、 、onDoubleTaponLongPress...のように画面全体からすべてのイベントを取得できます。

View私のカスタムレイアウトからどれが押されたかを検出することは可能ですか?

4

1 に答える 1

1

Android にはプラットフォームのソース コードがあるので、コアの ViewGroups がどのように実装されているかを確認し、そこから学ぶことをお勧めします。

ここViewGroupで利用可能なソースを調べてみましょう。関数を探します。それはあなたが探していることのほとんどを行います。dispatchTouchEvent()

どのビューが実際にタップされたかを把握するために、すべてのサブビューを反復処理し、各ビューのヒットレクトを要求して、関連性があるかどうかを確認します。コード:

for (int i = count - 1; i >= 0; i--) {
   final View child = children[i];
   if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE 
       || child.getAnimation() != null) {
       child.getHitRect(frame);
       if (frame.contains(scrolledXInt, scrolledYInt)) {

私はあなたが似たようなことをすることを提案することしかできません。

この手動の反復 (またはおそらくビュー内のビューに移動したいので再帰) を実行したくないと思います。この場合、おそらく通常のメカニズムにその魅力を持たせることができます (イベントが通常どおりサブビューに流れ込むようにします)。次に、処理する特定のビューにイベント ハンドラーを設定し、ハンドラーを呼び出して、どのビューがタップされたかを通知します。

覚えておくべきもう 1 つの興味深い点は、カスタム レイアウトがサブビューの静的変換をViewGroup.setStaticTransformationsEnabled(). 3D ビュー カルーセルを実装したときに、これらの変換を使用しました。この場合、あなたがやりたいことは不可能だと確信しています。サブビューは、静的変換によって画面上の別の場所に描画されるため、サブビューがどこにあるかを実際には知りません。この場合、カスタム レイアウトのおかげで、イベントをサブビューに正しくディスパッチできます。

于 2013-07-24T14:26:14.023 に答える