我正在尝试Android中的水平滑块菜单(如Facebook)。
我只希望我的容器View能够捕获鼠标触摸事件。
我已尝试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);
}
}
}
我应该采取什么策略来实现这一目标。
任何帮助将不胜感激。
答案 0 :(得分:1)
覆盖View.onInterceptTouchEvent()
中的ViewGroup
,请勿调用super.onInterceptTouchEvent()
并返回true。这会导致触摸事件不会传递到层次结构中(传递给ViewGroup
的子项)。
答案 1 :(得分:0)
我已经解决了这个问题@ nmw答案的灵感。
您应该扩展您的View组(我更喜欢使用LinearLayout
)。
对于子元素忽略鼠标触摸事件。您必须实施onInterceptTouchEvent
方法。
这是解决此问题的示例布局:
import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import 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);
}
}