代码路径
frameworks/base/core/java/android/widget/
frameworks/base/core/java/android/view/
常见组件继承关系如下
1.View.java
实现的接口如下
1. Drawable.Callback 绘图相关,有三个方法
implements Drawable.Callback //绘图相关
有三个接口,实现如下
@Override
public void invalidateDrawable(@NonNull Drawable drawable) {
if (verifyDrawable(drawable)) {
final Rect dirty = drawable.getDirtyBounds(); //获取一个矩形
final int scrollX = mScrollX;
final int scrollY = mScrollY;
invalidate(dirty.left + scrollX, dirty.top + scrollY,
dirty.right + scrollX, dirty.bottom + scrollY);
rebuildOutline();
}
}
//Schedules an action on a drawable to occur at a specified time
public void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when);
//Schedules an action on a drawable to occur at a specified time
public void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what);
2.KeyEvent.Callback 按键相关,有四个方法
boolean onKeyDown(int keyCode, KeyEvent event); //按钮按下
boolean onKeyLongPress(int keyCode, KeyEvent event); //长按
boolean onKeyUp(int keyCode, KeyEvent event); //按钮松开
boolean onKeyMultiple(int keyCode, int count, KeyEvent event);//按键重复
2.TextView
官方文档https://developer.android.google.cn/reference/android/widget/TextView
1.addTextChangedListener(输入文本监听)
TextWatcher中有三个方法,beforeTextChanged,onTextChanged和afterTextChanged
public void addTextChangedListener(TextWatcher watcher) { //文本监听
if (mListeners == null) {
mListeners = new ArrayList<TextWatcher>();
}
mListeners.add(watcher); //添加到mListeners中
}
2.为啥输入文本会监听到相关的动作
TextView 中的setText方法中定义了一个 mChangeWatcher来监听文本的变化,为子类ChangeWatcher的对象
子类ChangeWatcher 中有beforeTextChanged,onTextChanged,afterTextChanged, onSpanChanged,onSpanAdded, onSpanRemoved等方法
以onTextChanged为例,源码如下
private class ChangeWatcher implements TextWatcher, SpanWatcher {
public void onTextChanged(CharSequence buffer, int start, int before, int after) {
if (DEBUG_EXTRACT) {
Log.v(LOG_TAG, "onTextChanged start=" + start
+ " before=" + before + " after=" + after + ": " + buffer);
}
TextView.this.handleTextChanged(buffer, start, before, after);
if (AccessibilityManager.getInstance(mContext).isEnabled()
&& (isFocused() || isSelected() && isShown())) {
sendAccessibilityEventTypeViewTextChanged(mBeforeText, start, before, after);
mBeforeText = null;
}
}
}
//handleTextChanged
void handleTextChanged(CharSequence buffer, int start, int before, int after) {
。。。
resetErrorChangedFlag();
sendOnTextChanged(buffer, start, before, after);
onTextChanged(buffer, start, before, after);
}
//sendOnTextChanged
void sendOnTextChanged(CharSequence text, int start, int before, int after) {
if (mListeners != null) {
final ArrayList<TextWatcher> list = mListeners;
final int count = list.size();
for (int i = 0; i < count; i++) {
list.get(i).onTextChanged(text, start, before, after);//调用添加的listener中的onTextChanged
}
}
if (mEditor != null) mEditor.sendOnTextChanged(start, before, after);
}
3.Button
官方文档https://developer.android.google.cn/reference/android/widget/Button
1.setOnClickListener,定义在View.java中
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l; //子类ListenerInfo
}
点击按钮的堆栈打印如下
查看View中的performClick,源码如下
public boolean performClick() {
。。。
final boolean result;
final ListenerInfo li = mListenerInfo;
if (li != null && li.mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
li.mOnClickListener.onClick(this); //调用onClick
result = true;
} else {
result = false;
}
return result;
}
3.EditText 继承TextView
官方文档https://developer.android.google.cn/reference/android/widget/EditText
1.setOnFocusChangeListener,定义在View.java中
public void setOnFocusChangeListener(OnFocusChangeListener l) {
getListenerInfo().mOnFocusChangeListener = l;
}
protected void onFocusChanged(boolean gainFocus, @FocusDirection int direction,
@Nullable Rect previouslyFocusedRect) { //焦点改变时会调用这里
li.mOnFocusChangeListener.onFocusChange(this, gainFocus);
}
堆栈打印如下
4.View.java中定义的事件
static class ListenerInfo {
protected OnFocusChangeListener mOnFocusChangeListener; //对应setOnFocusChangeListener
private ArrayList<OnLayoutChangeListener> mOnLayoutChangeListeners; //对应addOnLayoutChangeListener
protected OnScrollChangeListener mOnScrollChangeListener; //对应setOnScrollChangeListener
private CopyOnWriteArrayList<OnAttachStateChangeListener> mOnAttachStateChangeListeners; //addOnAttachStateChangeListener
public OnClickListener mOnClickListener; //setOnClickListener
protected OnLongClickListener mOnLongClickListener; //setOnLongClickListener
protected OnContextClickListener mOnContextClickListener; //setOnContextClickListener
protected OnCreateContextMenuListener mOnCreateContextMenuListener; //setOnCreateContextMenuListener
private OnKeyListener mOnKeyListener; //setOnKeyListener
private OnTouchListener mOnTouchListener; //setOnTouchListener
private OnHoverListener mOnHoverListener; //setOnHoverListener
private OnGenericMotionListener mOnGenericMotionListener; //setOnGenericMotionListener
private OnDragListener mOnDragListener; //setOnDragListener
private OnSystemUiVisibilityChangeListener mOnSystemUiVisibilityChangeListener;//setOnSystemUiVisibilityChangeListener
OnApplyWindowInsetsListener mOnApplyWindowInsetsListener;//setOnApplyWindowInsetsListener
OnCapturedPointerListener mOnCapturedPointerListener; //setOnCapturedPointerListener
}