当前位置:   article > 正文

android View使用及源码分析_android view源码分析

android view源码分析

代码路径
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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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);//按键重复
  • 1
  • 2
  • 3
  • 4

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中
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.为啥输入文本会监听到相关的动作

 TextView 中的setText方法中定义了一个 mChangeWatcher来监听文本的变化,为子类ChangeWatcher的对象
  • 1

子类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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

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
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

点击按钮的堆栈打印如下
在这里插入图片描述
查看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;
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

堆栈打印如下
在这里插入图片描述

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
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号