最近在做需求,需求的要求是点击除了肤层之外的区域,肤层都消失,在肤层上有点击imageView 的事件,这个需求我们分两步
1 在全局监听 down 事件
getActivity().getWindow().setCallback(
new CallbackAgent(getActivity()) {
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return super.dispatchKeyEvent(event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (isNeedDismissCollectCover()) {
for (WiseHotelInfoViewModel wiseHotelInfoViewModel : mHotelListCacheBean.hotelList) {
if (wiseHotelInfoViewModel == null) {
continue;
}
wiseHotelInfoViewModel.isNeedCollection = false;
}
refreshAdapter();
}
}
return super.dispatchTouchEvent(event);
}
});
在window 中 监听callBack 在 ACTION_DOWN 中,只要屏幕之中有这样的点击事件,都会走这个流程
至于在window 中添加按钮,屏蔽事件
处理方式为
viewHolder.mCollectionBtn.setOnTouchListener(mCollectionListener);
private View.OnTouchListener mCollectionListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.getParent().requestDisallowInterceptTouchEvent(true);
Object obj = v.getTag();
if (obj != null && obj instanceof WiseHotelInfoViewModel) {
WiseHotelInfoViewModel viewModel = (WiseHotelInfoViewModel) obj;
if (isHotelCollected(viewModel)) {
HotelUtils.showToast("酒店已收藏");
} else {
startToEnshrine(viewModel);
}
return true;
}
return false;
}
};
onTouch 事件发生在OnTouchEvent 之前,所以当我们调用
v.getParent().requestDisallowInterceptTouchEvent(true);
允许事件分发在子View 中
子View return true 直接消耗该事件
其实我在思考,如果将ontouch 改成o'clock 行不行,实验下来不行,找了下答案,原因在于 onclick 是发生在onUp 后了
所以说
requestDisallowInterceptTouchEvent
的状态会被清理掉,常见的方式在是重写view 在view 的down 中设置为true 在up 和cancel 中设置为false