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 に答える