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);

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
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android ViewAndroid 中最基本的 UI 构建块之一,负责在屏幕上绘制视图并响应用户的操作。下面是一个简单的 View 分析过程: 1. 首先,我们需要了解 View 的继承关系。ViewAndroid 中所有 UI 组件的基类,它的直接子类包括 ViewGroup、TextView、ImageView 等。其中,ViewGroup 又是各种布局容器的基类,例如 LinearLayout、RelativeLayout 等。 2. 接着,我们可以查看 View 的基本属性。这些属性包括 layout_width、layout_height、padding、background 等。其中,layout_width 和 layout_height 决定了 View 在布局中的大小,padding 指定了 View 的内边距,background 则是 View 的背景。 3. View 的绘制过程可以分为两个阶段:测量和绘制。在测量阶段,View 会根据其 layout_width 和 layout_height 等属性计算出自身的尺寸。在绘制阶段,View 会将自身绘制到屏幕上。 4. View 的事件响应机制是 Android 中 UI 开发的重要部分。当用户触摸屏幕时,系统会将事件传递给 ViewView 会根据自身的点击区域判断是否响应该事件,并将事件传递给其父容器或下一个 View 进行处理。 5. 最后,我们可以查看 View码实现,深入了解 View 的内部实现逻辑。例如,View 的测量和绘制过程是通过 onMeasure 和 onDraw 方法实现的,事件响应机制是通过 onTouchEvent 和 dispatchTouchEvent 方法实现的。 总的来说,理解 Android View码实现可以帮助我们更好地理解 Android UI 开发的工作原理,从而编写出更高效、更灵活、更具交互性的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值