美文网首页
View绘制流程及事件分发

View绘制流程及事件分发

作者: 细雨蒙情 | 来源:发表于2019-03-20 10:25 被阅读0次

事件分发相关

1、事件分发流程

  • ViewGroup的事件分发
// 点击事件产生后,会直接调用dispatchTouchEvent()方法
public boolean dispatchTouchEvent(MotionEvent ev) {
    //代表是否消耗事件
    boolean consume = false;
    if (onInterceptTouchEvent(ev)) {
    //如果onInterceptTouchEvent()返回true则代表当前View拦截了点击事件
    //则该点击事件则会交给当前View进行处理
    //即调用super.dispatchTouchEvent(),及调用View的dispatchTouchEvent();
      consume = onTouchEvent (ev) ;
    } else {
      //如果onInterceptTouchEvent()返回false则代表当前View不拦截点击事件
      //则该点击事件则会继续传递给它的子元素
      //子元素的dispatchTouchEvent()就会被调用,重复上述过程
      //直到点击事件被最终处理为止
      consume = child.dispatchTouchEvent (ev) ;
    }
    return consume;
   }
  • View的事件分发
public boolean dispatchTouchEvent(MotionEvent event) {  
    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
            mOnTouchListener.onTouch(this, event)) {  
        return true;  
    }  
    return onTouchEvent(event);  
}
  • View和ViewGroup的OnTouchEvent
 if (((viewFlags & CLICKABLE) == CLICKABLE ||  
            (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {  
    //如果当前的事件是抬起手指,则会进入到MotionEvent.ACTION_UP这个case当中。
//如果该控件是可以点击的,就一定会返回true
        return true;  
    }  
//如果该控件是不可以点击的,就一定会返回false
    return false;  
}

2、onTouch、onTouchEvent、onClick

3、解决滑动冲突

二、View绘制流程

1、绘制流程

Android View的绘制流程
灵魂画师,Android绘制流程——Android高级UI

2、Activity,window,view,viewRoot关系

  • Activity 创建时通过attach()初始化了一个 Window 也就是 PhoneWindow,一个 PhoneWindow 持有一个 DecorView 的实例,DecorView 本身是一个 FrameLayout,继承于View,Activty通过setContentView将xml布局控件不断addView()添加到View中,最终显示到Window于我们交互;

三、自定义View

https://www.jianshu.com/p/c84693096e41
https://blog.csdn.net/carson_ho/article/details/62037696

四、动画

https://www.jianshu.com/p/733532041f46

相关文章

网友评论

      本文标题:View绘制流程及事件分发

      本文链接:https://www.haomeiwen.com/subject/fgsusftx.html