需求是这样的:
封装了一个View
,类似这样:
1
处的view
是添加进来的,需要在点了1
里面的某个view
之后,把整个view
隐藏掉。因为
1
处的view
是添加进来的,它里面的子view
的点击事件都写在它的类里面的,外部不知道有没有被点击,也就没法隐藏整个view
。
思路:利用view
的OnTouchListener
配合GestureDetector
来通知是否被点击了
- 如果这个
view
是ViewGroup
,遍历所有的子view
,判断子view
和自身是否有点击事件和是否显示
private void setGesture(ViewGroup viewGroup){
if(viewGroup.hasOnClickListeners() && viewGroup.getVisibility() == VISIBLE){
viewGroup.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return detector.onTouchEvent(event);//一定要返回false,否则会拦截onClick事件
}
});
}
for(int i = 0;i<viewGroup.getChildCount();i++){
View view = viewGroup.getChildAt(i);
if(view instanceof ViewGroup){
setGesture((ViewGroup) view);
continue;
}
if(view.hasOnClickListeners() && view.getVisibility() == VISIBLE){
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return detector.onTouchEvent(event); //一定要返回false,否则会拦截onClick事件
}
});
}
}
}
- 如果是
view
就跳过遍历子view
这一步
配合GestureDetector
:
detector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onSingleTapConfirmed(MotionEvent e) { //单击
if(onViewClick!= null){
onViewClick.onClick(null);
}
return super.onSingleTapConfirmed(e);
}
});
网友评论