我们之前刚刚分析完事件传递机制和view的源码,如果没有看过的,建议看完View的事件拦截机制浅析以及View的事件源码解析。这次我们来分析下viewgroup的。...而这一整套的机制就是在ViewGroup中体现出来的。我们先来看一张图: ?...接下来才是我们熟悉的触摸事件流程:首先是最顶端的ViewGroup(这边便是DecorView)的dispatchTouchEvent接收到事件。...如果没有取消并且没有拦截就执行正常的事件处理。 如果事件是针对可访问性焦点视图,我们将其提供给具有可访问性焦点的视图。如果它不处理它,我们清除该标志并像往常一样将事件分派给所有的 ChildView。...3.我们可以发现ViewGroup没有onTouchEvent事件,说明他的处理逻辑和View是一样的。 4.子view如果消耗了事件,那么ViewGroup就不会在接受到事件了。
大家好,又见面了,我是你们的朋友全栈君 LayoutParams是ViewGroup的一个内部类,声明方式如下 public static class LayoutParams { public...layout_width,layout_height,都是相对于父容器的 接下来分析,系统是如何将这个统一的ViewGroup.LayoutParams宽高属性给到View的呢?...addView中,同样的它也是默认创建的ViewGroup.LayoutParams,只支持width和height的 再分析下ViewGroup#generateLayoutParams(LayoutParams...= null; } ViewGroup默认的校验规则仅仅是不为空,相关宽松,LinearLayout等一般都会重写,有兴趣可以看源码 再分析下ViewGroup默认的generateLayoutParams...创建合法的LayoutParams,看下LinearLayout的实现 @Override protected boolean checkLayoutParams(ViewGroup.LayoutParams
Android 5.0之后ViewGroup的dispatchEvent源码更加复杂,由于方法含义不变,遂采用5.0之前的源码进行分析 dispatchTouchEvent 分析 mFirstTouchTarget...= 0; //这个返回为true根据是否调用parent.requestDisllowInterceptTouchEvent方法并设置false,就交给viewgroup的 onInterceptTouchEvent...的dispatchTouchevent进行处理 //否则交给子view的dispatchTouchEvent进行处理,这个子view可以是继承自view或者viewGroup private boolean...然后再传递给子view的 当viewgroup的onInterceptTouchEvent方法返回true,表示我要拦截该事件,那么子view就无法收到,否则方法返回false于是就传递给子view进行消费了...,那么父View就无法收到任何事件 当子view的onTouchEvent或者dispatchTouchEvent方法返回false,那么事件就会向上传递,将交给viewgroup进行处理
可以看到触发的DOWN MOVE UP事件顺序都为: ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> View.dispatchTouchEvent...这时候发现除了,执行的顺序变为了: ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> View.dispatchTouchEvent...-> View.onTouch -> View.onTouchEven->ViewGroup.onTouchEven 并且只有DOWN事件,其他事件就没有了。...这个时候就只有DOWN事件,并且顺序为: ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> ViewGroup.onTouchEvent...---- 接下来我们通过源码来分析: 首先从ViewGroup的dispatchTouchEvent入手 @Override public boolean dispatchTouchEvent
3.ViewGroup里怎么给孩子加动画 4.惯性移动?...也许你可以了解一下 效果 1 效果 2 一、前置知识: 1.生命函数 这是我曾经测试画出的一张图,描述了ViewGroup+两个孩子的生命函数调用情况 在这补充一点,ViewGroup...view.getHeight()获取尺寸(因为为0),只能用view.getMeasuredHeight 1.最简形式的ViewGroup 这里使用适配器模式,跟ListView一个套路,其实是非常简单...对子View用自带的测量方法measureChildren public class FlowerLayout extends ViewGroup { private int mRadius...注 接下来的这部分源于陈小缘的Android实现圆弧滑动效果之ArcSlidingHelper篇 我认真研究了一下,并融入了本ViewGroup,他封装的非常好,我拆了一下截取了和惯性相关的部分 不懂的可以去深度一下
涉及到kotlin语法的相关知识我就不多说了,今天就项目需求,自定义一个viewgroup作标签视图来使用进项目中去。...1、开写继承constructor 一般在java语言中,constructor直接在继承viewgroup后会报错,然后根据自定义快捷键,默认为alt+enter【博主是用的eclipse 的keymap...然而到了kotlin它的constructor很特别,可以根据语法如下书写: class Test constructor (private val context:Context) : ViewGroup...,同时让我们现在的viewgroup的宽高在程序中可以进行控制处理,不会让视图错乱。...的点击状态改变绑定的数据,从而控制了整个视图的变化。
ViewGroup的测量 之前分析中说了,ViewGroup会去管理其子View,其中一个管理项目就是负责子View的显示大小。...当ViewGroup的大小为wrap_content时,ViewGroup就需要对子View进行遍历,以便获得所有子View的大小,从而来决定自己的大小。...ViewGroup在测量时通过遍历所有子View,从而调用子View的Measure方法来获得每一个子View的测量结果,前面所说的对View的测量,就是在这里进行的。 ...在自定义ViewGroup时,通常会去重写onLayout()方法来控制其子View显示位置的逻辑。...ViewGroup的绘制 ViewGroup通常情况下不需要绘制,因为它本身就没有需要绘制的东西,如果不是指定了ViewGroup的背景颜色,那么ViewGroup的onDraw()方法都不会被调用。
网络上关于GridView可拖动的例子已经不少了,包括带动画不带动画的都有一堆,但几乎都是通过继承Android原生控件GridView来扩展的,当然这种实现方式是很容易联想到的,也是最容易实现的。...今天跟大家分享另外一种方式,通过继承ViewGroup来实现,我们都知道,ViewGroup可以填充很多个View,因此,我觉得可以类似把GridView的每一个Item填充到我们自定义的ViewGroup...中,然后监听长按时间,实现拖动的效果,同时加上动画效果,个人感觉比网上其他实现方式更加简洁和美观,唯一的缺点就是:没有setAdapter的函数,添加的item,需要我们手动add到ViewGroup中...其实代码也是很简单的,总共就两个类:一个自定义控件DragGridView,还有一个使用的例子MainActivity。...我们先来看看DragGridView的代码部分: /** * 另外一种方式实现动画可拖动item的GridView * * @author way * */ public class
1.LayoutParams LayoutParams 是ViewGroup的内部静态类 ,ViewGroup的子类(如RelativeLayout,LinearLayout,FrameLayout...)都有其对应的 ViewGroup.LayoutParams的子类,如RelativeLayoutParams LayoutParams 的作用:指定视图View 的高度(height) 和...View的布局参数(LayoutParams)和父容器的MeasureSpec值计算得来的,具体计算逻辑封装在getChildMeasureSpec(),即子view的大小由父view的MeasureSpec...view的LayoutParams确定子view的大小 // 当父view的模式为EXACITY时,父view强加给子view确切的值 //一般是父view设置为match_parent或者固定值的...ViewGroup switch (specMode) { case MeasureSpec.EXACTLY: // 当子view的LayoutParams>0,即有确切的值 if
这是官方的解释:在自定义ViewGroup时,ViewDragHelper可以用来拖拽和设置子View的位置(在ViewGroup范围内)。另外,还提供了一系列的方法和状态跟踪。...(二) 布局文件 布局很简单,自定义的ViewGroup包含两个TextView。...,可以随意被拖动位置 第二个View,只能从ViewGroup左侧拖动 第三个View,拖动释放之后会回到原始位置 修改后的ViewGroup代码如下: tryCaptureView方法,我们只捕获第一个和第三个...原因在于: 由于子View是可被点击的,那么会触发ViewGroup的onInterceptTouchEvent方法。...因为ViewGroup拦截了它的事件了啊。。。
今天给大家代码ViewGroup事件分发的源码解析~~凡是自定义ViewGroup实现各种滑动效果的,不可避免的会出现很多事件的冲突,对ViewGroup事件分发机制的了解,也有益于大家了解冲突产生的原因...源码分析 ViewGroup - dispatchTouchEvent 1、ViewGroup - dispatchTouchEvent - ACTION_DOWN 首先是ViewGroup的dispatchTouchEvent...true; ViewGroup的ACTION_DOWN分析结束,总结一下: ViewGroup实现捕获到DOWN事件,如果代码中不做TOUCH事件拦截,则开始查找当前x,y是否在某个子View的区域内...从源码也可以解释: ViewGroup MOVE和UP拦截的源码是这样的: if (!...true了,那么子View是木有办法的捕获事件的~~~ 4、如果没有找到合适的子View 我们的实例,直接点击ViewGroup内的按钮,当然直接很顺利的走完整个流程; 但是有两种特殊情况 1、ACTION_DOWN
这个函数是在ViewGroup里定义的,主要用于控制child View获取焦点的能力,比如是否阻止child View获取焦点。...他有三个常量可供设置 FOCUS_BEFORE_DESCENDANTS ViewGroup本身先对焦点进行处理,如果没有处理则分发给child View进行处理 FOCUS_AFTER_DESCENDANTS...先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理 FOCUS_BLOCK_DESCENDANTS ViewGroup本身进行处理,不管是否处理成功,都不会分发给...direction, Rect previouslyFocusedRect) { if (DBG) { System.out.println(this + " ViewGroup.requestFocus...FOCUS_BLOCK_DESCENDANTS " + "but is " + descendantFocusability); } } 通过这里的实现可以看到上面定义的三个常量设置的意思
因此,如果viewGroup当前有正在消费事件的子控件,那么viewGroup自己是不会消费down事件的。...,并发送给感兴趣的子控件;如果TouchTarget链表为空,那么直接分发给viewGroup自己;所以touchTarget不为空的情况下,viewGroup自己是不会消费事件的,这也就意味着viewGroup...viewGroup收到的事件类型和子view收到的事件类型并不是完全一致的,在分发给子view的时候,viewGroup需要对事件类型进行修改,一般有以下情况需要修改: viewGroup收到一个ACTION_POINTER_DOWN...= null) { mInputEventConsistencyVerifier.onTouchEvent(event, 0); } // 如果是down事件,停止嵌套滑动...mInputEventConsistencyVerifier.onUnhandledEvent(event, 0); } // 如果是事件序列终止事件或者没有消费down事件,终止嵌套滑动
正文 今天在代码里要动态改变 SurfaceView 的尺寸时,因为父布局是 FrameLayout ,自然就使用了 如下写法 val layoutParams = FrameLayout!!....layoutParams = layoutParams 最后运行的时候 , 没想到这样写居然会报错了???...8329ccc8bb7dc74799981a4131ffb74.png 异常说的是两个是不同类型的LayoutParams ,但明明都是ViewGroup的LayoutParams呀,而且log上没有标明位置...,实际是为什么呢 其实就是不去新建一个LayoutParams,而是从原来的View中直接获取LayoutParams。...因为,当一个View已经有了LayoutParams,是不能再次添加一个新创建的LayoutParams的,如果这样操作就会报这样的错。 一个小小的坑,希望大家看到后可以避免。
ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会产生一个触摸事件,但是这个触摸事件在底层是怎么分发的呢?...现在我们知道了,原来我们利用setContentView()设置Activity的View的外面还嵌套了这么多的东西 我们来理清下思路,Activity的最顶层窗体是PhoneWindow,而PhoneWindow...上面的ViewGroup的Touch事件分发就告一段落先,因为这里要调用TextView(也就是View)的dispatchTouchEvent()方法,所以我们先分析View的dispatchTouchEvent...()方法返回true)才会触发ACTION_MOVE,ACTION_UP的发生,如果某个ViewGroup拦截了Touch事件,则Touch事件交给ViewGroup处理 7.Touch事件的分发过程中...ViewGroup下面的Touch到的View,然后将Touch事件交给ViewGroup处理,并返回true
体系(十)自定义组合控件 前言 此前讲了很多,终于可以讲到这一节了,本文的例子是一个自定义的ViewGroup,左右滑动切换不同的页面,类似一个特别简化的ViewPager,这篇文章会涉及到这个系列的很多文章的内容比如...需要注意的是我们知道要实现一个自定义的ViewGroup是很复杂的,这个看看LineraLayout等源码我们就会知道,这里我们只需要把主要的功能实现就好了。...1.继承ViewGroup 要实现自定义的ViewGroup,首先要继承ViewGroup并调用父类构造方法,实现抽象方法等。...import android.content.Context;import android.util.AttributeSet;import android.view.ViewGroup;public...ViewGroup,onLayout这个抽象方法是必须要实现的,我们暂且什么都不做。
向一个ViewGroup中添加View或移除View时,针对当前所有的View,是可以有一个动画效果的,这个动画效果主要靠LayoutTransition实现。...默认情况下,ViewGroup是没有开启这个动画的,开启方式主要有两种: xml属性设置,设置ViewGroup的android:animateLayoutChanges="true" 代码设置...的Layout Animate viewGroup.layoutTransition = layoutTransition //控制APPEARING动画...(view, 0, ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT,...viewGroup.removeViewAt(0) } } } } 自定义LayoutTransition动画 改变APPEARING的动画是设置了一个Animate
Android中的View与我们以前理解的“视图”不同。在Android中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作系统中的window。...ViewGroup是View的子类,所以它也具有View的特性,但它主要用来充当View的容器,将其中的View视作自己的孩子,对它的子View进行管理,当然它的孩子也可以是ViewGroup类型。...ViewGroup和它的孩子们(View和ViewGroup)以树形结构形成了一个层次结构,View类有接受和处理消息的功能,android系统所产生的消息会在这些ViewGroup和 View之间传递...ViewGroup ViewGroup可以包含一个或多个View。ViewGroup本身就是一种特殊的View,它提供了一个布局,可以使用这个布局去组织一系列的View视图。...我们经常使用的LinearLayout、relativeLayout等都是ViewGroup的子类,ViewGroup类中有一个内部类ViewGroup.LayoutParams,我们经常使用LayoutParams
ViewGroup 我们知道ViewGroup就是View的容器类,我们经常用的LinearLayout,RelativeLayout等都是ViewGroup的子类,因为ViewGroup有很多子View...()方法,设置ViewGroup的宽高即可,如果是wrap_content,就比较麻烦了,我们需要遍历所有的子View,然后对每个子View进行测量,然后根据子View的排列规则,计算出最终ViewGroup...ViewGroup的onDraw默认实现方法即可。...LayoutParams ViewGroup还有一个很重要的知识LayoutParams,LayoutParams存储了子View在加入ViewGroup中时的一些参数信息,在继承ViewGroup类时...,在你定义的ViewGroup子类中,新建一个LayoutParams类继承与ViewGroup.LayoutParams。
在继承ViewGroup类时,需要重写两个方法,分别是onMeasure和onLayout。...4,解析onLayout(boolean, int, int, int, int)方法 void android.view.ViewGroup.onLayout(boolean changed, int...在这里给大家举一个例子demo: 第一步:自定义一个View实现ViewGroup接口,即自定义ViewGroup: import android.content.Context; import android.util.AttributeSet...widthMeasureSpec); int measureHeight = measureHeight(heightMeasureSpec); // 计算自定义的ViewGroup...> 相关视频 ViewGroup的layout布局过程
领取专属 10元无门槛券
手把手带您无忧上云