赞
踩
代码路径
frameworks/base/core/java/android/widget/
frameworks/base/core/java/android/view/
常见组件继承关系如下
实现的接口如下
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);
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);//按键重复
官方文档https://developer.android.google.cn/reference/android/widget/TextView
TextWatcher中有三个方法,beforeTextChanged,onTextChanged和afterTextChanged
public void addTextChangedListener(TextWatcher watcher) { //文本监听
if (mListeners == null) {
mListeners = new ArrayList<TextWatcher>();
}
mListeners.add(watcher); //添加到mListeners中
}
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); }
官方文档https://developer.android.google.cn/reference/android/widget/Button
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;
}
官方文档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);
}
堆栈打印如下
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 }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。