4

MediaController は常に画面内のすべてのビューの上に表示され、非表示になるまでビューの下にクリックを渡さないでください。私の問題は次のとおりです。

ボタンビューを MediaController の上に追加して、クリックイベントを処理する方法は? またはクリックイベントをビューの下に渡す方法は?

4

2 に答える 2

2

MediaController をオーバーライドしてみてください。ディスパッチタッチイベント()

それはあなたの仕事により適しています。理由の詳細な説明については、こちらの回答を参照してください。

コードは次のようになります。

public class MyMediaController extends MediaController {
    ...
    private WeakReference<Button> mButton;

    // TODO You'll have to call this whenever the layout might have been rebuilt
    // i.e. in onCreate() of your activity (or in onConfigurationChanged() if you
    // handle configuration changes yourself)
    public void setButton(Button button) {
        mButton = new WeakReference<Button>(button);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        int iX = (int) event.getX();
        int iY = (int) event.getY();

        Button button = mButton.get();
        if (button != null) {
            Rect buttonHitRect = new Rect();
            button.getHitRect(buttonHitRect);
            if (buttonHitRect != null && buttonHitRect.contains(iX, iY)) {
                // user hit the button, dispatch event to the button
                button.dispatchTouchEvent(event);
                return true;
            }
        }
        // button did not get hit, pass the touch through
        return super.dispatchTouchEvent(event)
    }
}

これを試してみて、どうなるか教えてください。

UPDこれについて非常によく似た質問があります。より良い解決策があるかもしれません: Android MediaControllerは他のすべてのタッチイベントを傍受します

于 2012-08-28T10:21:38.407 に答える
1

ビューが別のビューに重なっている場合、一番上のビューがタッチ イベントを消費するため、非表示のビューはタッチ イベントを取得しません。非表示のビューでタッチ イベントを受信する場合は、タッチ イベントをトップ ビューから非表示のビューに手動で渡す必要があります。ここでは、次の 2 つの可能性があります。

  • 両方のビューでタッチ イベントを共有する必要があります。この場合、非表示のビューにタッチ イベントを渡した後、トップ ビューの onTouch() メソッドから false を返すことで、タッチ イベントが消費されていないことを Android に示します。
  • 非表示ビューのみでタッチ イベントを処理する場合: この場合、非表示ビューにタッチ イベントを渡した後、トップ ビューの onTouch() メソッドから true を返すことによって、タッチ イベントが消費されたことを Android に示します。

これのサンプルコードは次のとおりです。

btn.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch (View v, MotionEvent event)
        {
            list.onTouchEvent(event);
            return true;       // return true if touch event is consumed else return false
        }
    });

このための XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@drawable/shape" >

    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#00000000" >
    </ListView>

    <Button
        android:id="@+id/view"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#88cc0000"
        android:layout_alignParentTop="true"
        android:onClick="showMe" />
</RelativeLayout>

ここで、ボタンはリスト ビューを隠していますが、タッチ イベントが下のレイアウトに渡されると、リストはスクロールします。
これが役立つことを願っています。:)

于 2012-08-21T22:09:24.567 に答える