美文网首页
自定义View学习笔记

自定义View学习笔记

作者: 小相柳 | 来源:发表于2016-09-20 16:40 被阅读23次

    一、事件分发

    1.setOnLongClickListener和setOnClickListener是否只能执行一个?

    不是的,只要setOnLongClickListener中的onClick返回false,则两个都会执行;返回true则会 (屏幕-> 屏蔽)setOnClickListener

    2.如果ViewGroup在onInterceptTouchEvent(ev)  ACTION_DOWN里面直接return true了,那么子View是木有办法的捕获事件的~~~

    3、如果ViewGroup找到了能够处理该事件的View,则直接交给子View处理,自己的onTouchEvent不会被触发;

    4、可以通过复写onInterceptTouchEvent(ev)方法,拦截子View的事件(即return true),把事件交给自己处理,则会执行自己对应的onTouchEvent方法

    5、子View可以通过调用getParent().requestDisallowInterceptTouchEvent(true);  阻止ViewGroup对其MOVE或者UP事件进行拦截;

    二、View的3种测量模式:

    上面提到了ViewGroup会为childView指定测量模式,下面简单介绍下三种测量模式:

    EXACTLY:表示设置了精确的值,一般当childView设置其宽、高为精确值、match_parent时,ViewGroup会将其设置为EXACTLY;

    AT_MOST:表示子布局被限制在一个最大值内,一般当childView设置其宽、高为wrap_content时,ViewGroup会将其设置为AT_MOST;

    UNSPECIFIED:表示子布局想要多大就多大,一般出现在AadapterView的item的heightMode中、ScrollView的childView的heightMode中;此种模式比较少见。

    注:上面的每一行都有一个一般,意思上述不是绝对的,对于childView的mode的设置还会和ViewGroup的测量mode有一定的关系

    View:根据ViewGroup传入的测量值和模式,对自己宽高进行确定(onMeasure中完成),然后在onDraw中完成对自己的绘制。

    ViewGroup:需要给View传入view的测量值和模式(onMeasure中完成),而且对于此ViewGroup的父布局,自己也需要在onMeasure中完成对自己宽和高的确定。此外,需要在onLayout中完成对其childView的位置的指定。

    三、invalidate()和postInvalidate() 的区别及使用

    invalidate()是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。

    而postInvalidate()在工作者线程中被调用

    相关文章

      网友评论

          本文标题:自定义View学习笔记

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