@RemotableViewMethod
public void setEnabled(boolean enabled) {
if (enabled == isEnabled()) return;
setFlags(enabled ? ENABLED : DISABLED, ENABLED_MASK);
/*
* The View most likely has to change its appearance, so refresh
* the drawable state.
*/
refreshDrawableState();
// Invalidate too, since the default behavior for views is to be
// be drawn at 50% alpha rather than to change the drawable.
invalidate(true);
if (!enabled) {
cancelPendingInputEvents();
}
}可以看到setEnable(false) 将View的flag打上了DISABLED.
public boolean onKeyDown(int keyCode, KeyEvent event) {
..............................................................
if (KeyEvent.isConfirmKey(keyCode)) {
if ((mViewFlags & ENABLED_MASK) == DISABLED) {
return true;
}
...................................................................
} public boolean onKeyUp(int keyCode, KeyEvent event) {
if (KeyEvent.isConfirmKey(keyCode)) {
if ((mViewFlags & ENABLED_MASK) == DISABLED) {
return true;
}
...................................................................
} private boolean isHoverable() {
.................................................................
if ((viewFlags & ENABLED_MASK) == DISABLED) {
return false;
}
....................................................................
}public boolean onTouchEvent(MotionEvent event) {
final int viewFlags = mViewFlags;
if ((viewFlags & ENABLED_MASK) == DISABLED) {
if (event.getAction() == MotionEvent.ACTION_UP && (mPrivateFlags & PFLAG_PRESSED) != 0) {
setPressed(false);
}
............................................................
}可以看到,Enable false 把key event和 touch event都屏蔽掉了。

探讨了在特定场景下,视图设置为不可用时如何影响按键事件和触摸事件的处理过程,揭示了在视图被禁用时,如何通过判断视图标志位来屏蔽这些事件,并解释了其背后的原理。
1148





