展开

关键词

ViewGroup 事件分发

Android 5.0之后ViewGroup的dispatchEvent源码更加复杂,由于方法含义不变,遂采用5.0之前的源码进行分析 dispatchTouchEvent 分析 mFirstTouchTarget = 0; //这个返回为true根据是否调用parent.requestDisllowInterceptTouchEvent方法并设置false,就交给viewgroup的 onInterceptTouchEvent 处理,子view没有处理,就会交给子view上层viewgroup处理。 false事件才会回溯,交给viewgroup处理事件         if (mFirstTouchTarget == null) {             // No touch targets transformedEvent.recycle();     return handled; } ViewGroup dispatchTouchEvent 分析总结 Android事件分发先从ViewGroup

33710

ViewGroup源码解读

这次我们来分析下viewgroup的。 可能有人会想,怎么又是源码分析,肯定又是一大通。其实没你想的那么复杂。仔细分析一波就行了。 而这一整套的机制就是在ViewGroup中体现出来的。我们先来看一张图: ? 接下来才是我们熟悉的触摸事件流程:首先是最顶端的ViewGroup(这边便是DecorView)的dispatchTouchEvent接收到事件。 总结 1.ViewGroup包涵多个子view的时候,我们是从后遍历,判断当前view是否可以点击,然后分发给需要处理的子view。 3.我们可以发现ViewGroup没有onTouchEvent事件,说明他的处理逻辑和View是一样的。 4.子view如果消耗了事件,那么ViewGroup就不会在接受到事件了。

39280
  • 广告
    关闭

    腾讯云校园大使火热招募中!

    开学季邀新,赢腾讯内推实习机会

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android ViewGroup事件分发

    ---- 首先我们自定义一个ViewGroup和一个View,然后重写相关事件进行打印: 场景一:正常返回super,TouchView设置click和onTouchListener事件(onTouch 可以看到触发的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

    59720

    Kotlin 自定义 标签viewgroup

    涉及到kotlin语法的相关知识我就不多说了,今天就项目需求,自定义一个viewgroup作标签视图来使用进项目中去。 1、开写继承constructor 一般在java语言中,constructor直接在继承viewgroup后会报错,然后根据自定义快捷键,默认为alt+enter【博主是用的eclipse 的keymap 然而到了kotlin它的constructor很特别,可以根据语法如下书写: class Test constructor (private val context:Context) : ViewGroup View.MeasureSpec.EXACTLY) sizeHeight else resultHeight) } } 通过以上方法我们控制了子view的显示,同时让我们现在的viewgroup

    62930

    Android自定义ViewGroup神器-ViewDragHelper

    这是官方的解释:在自定义ViewGroup时,ViewDragHelper可以用来拖拽和设置子View的位置(在ViewGroup范围内)。另外,还提供了一系列的方法和状态跟踪。 的编写 (一) 自定义ViewGroup ? 布局很简单,自定义的ViewGroup包含两个TextView。 第一个View,可以随意被拖动位置 第二个View,只能从ViewGroup左侧拖动 第三个View,拖动释放之后会回到原始位置 修改后的ViewGroup代码如下: ? ? 因为ViewGroup拦截了它的事件了啊。。。

    73950

    Android ViewGroup.setDescendantFocusability函数

    这个函数是在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

    43210

    android viewgroup事件分发机制

    今天给大家代码ViewGroup事件分发的源码解析~~凡是自定义ViewGroup实现各种滑动效果的,不可避免的会出现很多事件的冲突,对ViewGroup事件分发机制的了解,也有益于大家了解冲突产生的原因 ,然后才会到View自身~ 下面我们按照日志的输出,进入源码~ 2、源码分析 ViewGroup - dispatchTouchEvent 1、ViewGroup - dispatchTouchEvent 的ACTION_DOWN分析结束,总结一下: ViewGroup实现捕获到DOWN事件,如果代码中不做TOUCH事件拦截,则开始查找当前x,y是否在某个子View的区域内,如果在,则把事件分发下去。 捕获到事件,然后判断是否拦截,如果没有拦截,则直接调用mMotionTarget.dispatchTouchEvent(ev) 3、ACTION_UP中,ViewGroup捕获到事件,然后判断是否拦截, 从源码也可以解释: ViewGroup MOVE和UP拦截的源码是这样的: if (!

    39160

    自定义控件基础 之 3.4 ViewGroup的测量 & 3.5 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()方法都不会被调用。

    28320

    viewgroup实现item拖动效果

    今天跟大家分享另外一种方式,通过继承ViewGroup来实现,我们都知道,ViewGroup可以填充很多个View,因此,我觉得可以类似把GridView的每一个Item填充到我们自定义的ViewGroup 中,然后监听长按时间,实现拖动的效果,同时加上动画效果,个人感觉比网上其他实现方式更加简洁和美观,唯一的缺点就是:没有setAdapter的函数,添加的item,需要我们手动add到ViewGroup中 **  * 另外一种方式实现动画可拖动item的GridView  *   * @author way  *   */ public class DragGridView extends ViewGroup

    51560

    为什么都是ViewGroup的LayoutParams,也会报cannot be cast to android.view.ViewGroup$MarginLayoutParams?

    8329ccc8bb7dc74799981a4131ffb74.png 异常说的是两个是不同类型的LayoutParams ,但明明都是ViewGroup的LayoutParams呀,而且log上没有标明位置

    14830

    Android View体系(十一)自定义ViewGroup

    的layout和draw流程 Android View体系(九)自定义View Android View体系(十)自定义组合控件 前言 此前讲了很多,终于可以讲到这一节了,本文的例子是一个自定义的ViewGroup 需要注意的是我们知道要实现一个自定义的ViewGroup是很复杂的,这个看看LineraLayout等源码我们就会知道,这里我们只需要把主要的功能实现就好了。 1.继承ViewGroup 要实现自定义的ViewGroup,首先要继承ViewGroup并调用父类构造方法,实现抽象方法等。 import android.content.Context;import android.util.AttributeSet;import android.view.ViewGroup;public class HorizontalView extends ViewGroup{ public HorizontalView(Context context) { super(context

    57550

    继承ViewGroup学习onMeasure和onLayout

    在继承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 ; import android.view.View; import android.view.ViewGroup; public class MyViewGroup extends > </RelativeLayout> 相关视频 ViewGroup的layout布局过程

    11740

    android之View和ViewGroup介绍

    ViewGroup和它的孩子们(View和ViewGroup)以树形结构形成了一个层次结构,View类有接受和处理消息的功能,android系统所产生的消息会在这些ViewGroup和 View之间传递 ViewGroup ViewGroup可以包含一个或多个View。ViewGroup本身就是一种特殊的View,它提供了一个布局,可以使用这个布局去组织一系列的View视图。 ViewGroup继承于View,它可以包含其他的View,就像一个View的容器,我们可以调用其成员函数addView()将View当作孩子放到ViewGroup中。 我们经常使用的LinearLayout、relativeLayout等都是ViewGroup的子类,ViewGroup类中有一个内部类ViewGroup.LayoutParams,我们经常使用LayoutParams 每个“ViewGroup”都继承自基类android.view.ViewGroup

    6820

    Android自定义ViewGroup实现竖向引导界面

    :text="hello" / </RelativeLayout </com.example.verticallinearlayout.VerticalLinearLayout 在自定义的ViewGroup android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewGroup android.view.WindowManager; import android.widget.Scroller; public class VerticalLinearLayout extends ViewGroup 源码下载:Android自定义ViewGroup实现竖向引导界面 以上就是本文的全部内容,希望对大家的学习有所帮助。

    18830

    View,ViewGroup的Touch事件的分发机制

    ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会产生一个触摸事件,但是这个触摸事件在底层是怎么分发的呢? final View target = mMotionTarget;   //mMotionTarget为null意味着没有找到消费Touch事件的View, 所以我们需要调用ViewGroup父类的 我们先不管,继续看代码,走到25行,  disallowIntercept默认为false,我们再看ViewGroup的onInterceptTouchEvent()方法 public boolean 拦截了Touch事件,则Touch事件交给ViewGroup处理 7.Touch事件的分发过程中,如果消费了ACTION_DOWN,而在分发ACTION_MOVE的时候,某个ViewGroup拦截了Touch 事件,就像上面那个自定义CustomLayout,则会将ACTION_CANCEL分发给该ViewGroup下面的Touch到的View,然后将Touch事件交给ViewGroup处理,并返回true

    43670

    教你搞定Android自定义ViewGroup

    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初始化时我们添加了一个+号按钮,给用户点击添加新的图片。

    38110

    viewGroup与view对事件的处理

    viewGroup寻找子控件的步骤也不复杂。 因此,如果viewGroup当前有正在消费事件的子控件,那么viewGroup自己是不会消费down事件的。 自己;所以touchTarget不为空的情况下,viewGroup自己是不会消费事件的,这也就意味着viewGroup和其中的view不会同时消费事件。 viewGroup收到的事件类型和子view收到的事件类型并不是完全一致的,在分发给子view的时候,viewGroup需要对事件类型进行修改,一般有以下情况需要修改: viewGroup收到一个ACTION_POINTER_DOWN 每一个事件到达viewGroup,如果需要分发到子view,那么viewGroup会新判断是否要拦截。 当viewGroup的touchTarget!

    17310

    实战-自定义ViewGroup-流动布局(FlowLayout)

    安卓自定义 ViewGroup 需要注意的地方 至少需要提供 width, 和height两个属性 同样地,如果要使用自定义的属性,那么就需要创建自己的名字空间,在Android Studio中,第三方的控件都使用如下代码来引入名字空间 ; /** * 流式布局 * * @author l1k */ public class FlowLayout extends ViewGroup { private static generateLayoutParams(ViewGroup.LayoutParams p) { return new LayoutParams(p); } @Override (getContext(), attrs); } @Override protected ViewGroup.LayoutParams generateDefaultLayoutParams lp) { super(lp); } public LayoutParams(ViewGroup.MarginLayoutParams lp)

    8010

    从自定义ViewGroup看layout作用

    viewGroup和view的layout方法又有什么不同?一起来看看吧。 下面看看ViewGroup。 那ViewGroup的子View怎么办呢? 自定义垂直布局VerticalLayout 首先,我们要确定我们这个自定义ViewGroup的作用,是类似垂直方向的LinearLayout功能,在该ViewGroup下的子View可以按垂直线性顺序依次往下排放 我们给它起个名字叫VerticalLayout~ 继承ViewGroup 首先,我们这个布局肯定要继承自ViewGroup,并且实现相应的构造方法: public class VerticalLayout

    18020

    ViewGroup内容改变时的动画效果—LayoutTransition

    向一个ViewGroup中添加View或移除View时,针对当前所有的View,是可以有一个动画效果的,这个动画效果主要靠LayoutTransition实现。 LayoutTransition是什么 开启LayoutTransition LayoutTransition可以使ViewGroup在布局发生变化时产生动画。 默认情况下,ViewGroup是没有开启这个动画的,开启方式主要有两种: xml属性设置,设置ViewGroup的android:animateLayoutChanges="true" 代码设置 的Layout Animate viewGroup.layoutTransition = layoutTransition //控制APPEARING动画 (view, 0, ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT,

    95520

    扫码关注腾讯云开发者

    领取腾讯云代金券