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 Theres's a very similar question on this,它可能有更好的解决方案:Android MediaController拦截所有其他触摸事件

于 2012-08-28T10:21:38.407 回答
1

当一个视图与另一个视图重叠时,隐藏的视图将不会获得任何触摸事件,因为顶部的视图会消耗触摸事件。如果你想让隐藏视图接收触摸事件,那么你必须手动将触摸事件从顶视图传递到隐藏视图。这里有两种可能:

  • 您希望两个视图共享触摸事件:在这种情况下,将触摸事件传递给隐藏视图后,通过从顶部视图的 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>

这里 Button 隐藏了列表视图,当触摸事件传递到下面的布局时,列表仍然会滚动。
我希望这将有所帮助。:)

于 2012-08-21T22:09:24.567 回答