0

我正在尝试在 Android 中使用水平滑块菜单(如 Facebook)。

我只希望我的容器视图能够捕获鼠标触摸事件。

我已经尝试setEnable(false)了容器视图的所有子元素。但这会导致视图无法捕获触摸事件。

public void ChangeMenuVisibility() {
        int menuWidth = menu.getMeasuredWidth();
        // Ensure menu is visible
        menu.setVisibility(View.VISIBLE);
        int left = !menuOut ? 0 : menuWidth;
        container.smoothScrollTo(left, 0);
        menuOut = !menuOut;
        ViewUtils.enableDisableViewGroup(
                (ViewGroup) window.findViewById(R.id.main_content), !menuOut);
        window.findViewById(R.id.main_content).setEnabled(true);
    }
[ViewUtils.java]
    public static void enableDisableViewGroup(ViewGroup viewGroup,
            boolean enabled) {
        int childCount = viewGroup.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View view = viewGroup.getChildAt(i);
            view.setEnabled(enabled);
            if (view instanceof ViewGroup) {
                enableDisableViewGroup((ViewGroup) view, enabled);
            }
        }
    }

我应该遵循什么策略来实现这一点。

任何帮助将不胜感激。

4

2 回答 2

1

View.onInterceptTouchEvent()在 中覆盖ViewGroup,不要调用super.onInterceptTouchEvent()并返回 true。这会导致触摸事件不会向下传递到层次结构(传递给 的子级ViewGroup)。

于 2013-01-06T10:58:11.713 回答
0

我已经根据@nmw 的回答解决了这个问题。

您应该扩展您的 View 组(我更喜欢使用LinearLayout)。

对于子元素忽略鼠标触摸事件。你必须实现onInterceptTouchEvent方法。

这是解决此问题的示例布局:

导入android.content.Context;导入android.util.AttributeSet;导入 android.view.MotionEvent;导入 android.widget.LinearLayout;

public class MyLinearLayout extends LinearLayout {

    public MyLinearLayout(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public MyLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    boolean mChildCanCaptureTouchEvent = true;

    /**
     * @return the mChildCanCaptureTouchEvent
     */
    public boolean ChildCanCaptureTouchEvent() {
        return mChildCanCaptureTouchEvent;
    }

    /**
     * @param mChildCanCaptureTouchEvent
     *            the mChildCanCaptureTouchEvent to set
     */
    public void ChildCanCaptureTouchEvent(boolean mChildCanCaptureTouchEvent) {
        this.mChildCanCaptureTouchEvent = mChildCanCaptureTouchEvent;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (ev.getAction() != MotionEvent.ACTION_MOVE) {
            return true;
        }

        if (!mChildCanCaptureTouchEvent)
            return true;

        return super.onInterceptTouchEvent(ev);
    }
}
于 2013-01-06T12:15:01.277 回答