首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

自定义控件基础 之 3.4 ViewGroup的测量 & 3.5 ViewGroup的绘制

ViewGroup的测量 之前分析中说了,ViewGroup会去管理其子View,其中一个管理项目就是负责子View的显示大小。...当ViewGroup的大小为wrap_content时,ViewGroup就需要对子View进行遍历,以便获得所有子View的大小,从而来决定自己的大小。...而在其他模式下则会通过具体的指定值来设置自身的大小。   ...ViewGroup在测量时通过遍历所有子View,从而调用子View的Measure方法来获得每一个子View的测量结果,前面所说的对View的测量,就是在这里进行的。   ...ViewGroup的绘制 ViewGroup通常情况下不需要绘制,因为它本身就没有需要绘制的东西,如果不是指定了ViewGroup的背景颜色,那么ViewGroup的onDraw()方法都不会被调用。

48920

使用OpenCV测量图像中物体的大小

原文链接:https://www.pyimagesearch.com/2016/03/28/measuring-size-of-objects-in-an-image-with-opencv/ 今天的文章是关于测量图像中物体大小和计算它们之间距离的系列文章的第二部分...测量图像中物体的大小类似于计算相机到物体的距离——在这两种情况下,我们都需要定义一个比率来测量每个计算对象的像素数。 我将其称为“像素/度量”比率,我将在下面中对其进行更正式的定义。...使用这个比率,我们可以计算图像中物体的大小。 用计算机视觉测量物体的大小 现在我们了解了“像素/度量”比率,我们可以实现用于测量图像中对象大小的Python驱动程序脚本。...执行一个额外的校准步骤来找到这些参数可以“消除”我们图像的失真,并得到更精确的物体大小。...让我们来看看测量物体大小的第二个例子,这次是测量药丸的尺寸: 在美国20000多种处方药中,近50%是圆形或白色的,因此如果我们能根据药片的尺寸进行筛选,我们就更有可能准确地识别出药物。

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

    ViewGroup的LayoutParams理解

    大家好,又见面了,我是你们的朋友全栈君 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

    37230

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

    ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会产生一个触摸事件,但是这个触摸事件在底层是怎么分发的呢?...上面的ViewGroup的Touch事件分发就告一段落先,因为这里要调用TextView(也就是View)的dispatchTouchEvent()方法,所以我们先分析View的dispatchTouchEvent...事件就会向上找父布局调用其父布局的onTouchEvent()处理,如果这个View返回true,表示消费了Touch事件,就不调用父布局的onTouchEvent() 接下来我们用一个自定义的ViewGroup...()方法返回true)才会触发ACTION_MOVE,ACTION_UP的发生,如果某个ViewGroup拦截了Touch事件,则Touch事件交给ViewGroup处理 7.Touch事件的分发过程中...ViewGroup下面的Touch到的View,然后将Touch事件交给ViewGroup处理,并返回true

    1.2K70

    viewGroup与view对事件的处理

    ViewGroup对于事件的分发 这一步可以说是事件分发中的重头戏了。不过在理解了上面的MotionEvent之后,对于ViewGroup的分发细节也就容易理解了。...对于viewGroup来说,他有很多个子view,如果不同的子view接受了不同的触控点的down事件,那么ViewGroup如何记录这些信息并精准把事件发送给对应的子view呢?...因此,如果viewGroup当前有正在消费事件的子控件,那么viewGroup自己是不会消费down事件的。...,并发送给感兴趣的子控件;如果TouchTarget链表为空,那么直接分发给viewGroup自己;所以touchTarget不为空的情况下,viewGroup自己是不会消费事件的,这也就意味着viewGroup...viewGroup收到的事件类型和子view收到的事件类型并不是完全一致的,在分发给子view的时候,viewGroup需要对事件类型进行修改,一般有以下情况需要修改: viewGroup收到一个ACTION_POINTER_DOWN

    93110

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

    正文 今天在代码里要动态改变 SurfaceView 的尺寸时,因为父布局是 FrameLayout ,自然就使用了 如下写法 val layoutParams = FrameLayout!!....layoutParams = layoutParams 最后运行的时候 , 没想到这样写居然会报错了???...8329ccc8bb7dc74799981a4131ffb74.png 异常说的是两个是不同类型的LayoutParams ,但明明都是ViewGroup的LayoutParams呀,而且log上没有标明位置...,实际是为什么呢 其实就是不去新建一个LayoutParams,而是从原来的View中直接获取LayoutParams。...因为,当一个View已经有了LayoutParams,是不能再次添加一个新创建的LayoutParams的,如果这样操作就会报这样的错。 一个小小的坑,希望大家看到后可以避免。

    58330

    Carson带你学Android:手把手带你深入学习自定义View Measure过程

    size:提供的默认大小 // measureSpec:宽/高的测量规格(含模式 & 测量大小) // 设置默认大小 int result = size;...// 获取宽/高测量规格的模式 & 测量大小 int specMode = MeasureSpec.getMode(measureSpec); int specSize =...测量原理 从ViewGroup至子View、自上而下遍历进行(即树形递归),通过计算整个ViewGroup中各个View的属性,从而最终确定整个ViewGroup的属性。...即: 遍历测量所有子View的尺寸(宽/高); 合并所有子View的尺寸(宽/高),最终得到ViewGroup父视图的测量值。...复写onMeasure()的步骤主要分为三步: 遍历所有子View及测量:measureChildren() 合并所有子View的尺寸大小,最终得到ViewGroup父视图的测量值:需自定义实现 存储测量后

    31910

    自定义View Measure过程 - 最易懂的自定义View原理系列(2)

    储备知识 了解measure过程前,需要先了解传递尺寸(宽 / 高测量值)的2个类: ViewGroup.LayoutParams类() MeasureSpecs 类(父视图对子视图的测量要求) 2.1...// size:提供的默认大小 // measureSpec:宽/高的测量规格(含模式 & 测量大小) // 设置默认大小 int result...)具备不同的布局特性,这导致他们子View的测量方法各有不同 而onMeasure()的作用 = 测量View的宽/高值 因此,ViewGroup无法对onMeasure()作统一实现。...遍历所有子View & 测量:measureChildren() * 2. 合并所有子View的尺寸大小,最终得到ViewGroup父视图的测量值(自身实现) * 3....合并所有子View的尺寸大小,最终得到ViewGroup父视图的测量值 void measureCarson{ ... // 自身实现 }

    91920

    Android自定义View中的onMeasure、onLayout和onDraw方法解析

    然后根据这些信息,计算并设置View的宽度和高度。 总的来说,MeasureSpec是Android中测量View大小的一个重要机制,它帮助我们理解和处理View的测量过程。...onMeasure方法用于测量View的大小,onDraw方法用于绘制View的内容,而onLayout方法在此例中并未涉及,因为我们的CircleView直接继承自View,没有子View的布局需求。...接着遍历所有的子View,测量子View的大小,并更新当前行的宽度。检查当前行宽度是否超过ViewGroup的宽度,如果超过了,更新ViewGroup的宽度,累加高度,并重置当前行的宽度。...最后,更新ViewGroup的宽度和高度,并设置ViewGroup的测量宽高。...onMeasure方法用于测量View的大小,onDraw方法用于绘制View的内容,onLayout方法用于确定View的位置。

    29110

    Android组件View绘制流程原理分析

    android的View绘制 view绘制主要包括三个方面: measure 测量组件本身的大小 layout 确定组件在视图中的位置 draw 根据位置和大小,将组件画出来 视图绘制的起点在ViewRootImpl...mView.draw(canvas); ...... } measure计算视图大小 几乎所有的组件都是继承View类的,而关于view的测量工作,日常开发用得多的方法就是measure...final的,不允许重载,View子类只能重载onMeasure来完成自己的测量逻辑。...View的布局大小由父View和子View共同决定。...区分View动画和ViewGroup布局动画,前者指的是View自身的动画,可以通过setAnimation添加,后者是专门针对ViewGroup显示内部子视图时设置的动画,可以在xml布局文件中对ViewGroup

    1.2K40

    量子计算(八):观测量和计算基下的测量

    ​观测量和计算基下的测量​一、观测量量子比特(qubit)不同于经典的比特(bit),一个量子比特|>可以同时处于|0>和|1>两个状态,可用线性代数中的线性组合(linear combination)...二、计算基下的测量在计算基下单量子比特的测量,单量子比特在计算基下有两个测量算子分别是。注意到这两个测量算子都是自伴的,即且因此该测量算子满足完备性方程。...设系统被测量时的状态是,则测量结果为0的概率为对应测量后的状态为测量结果为1的概率为测量后的状态为量子测量有很多种方式,比如投影测量(projective measurements)、POVM 测量(Positive...可观测量可以写成谱分解的形式这里的为在的特征值对应特征空间上的投影。测量的可能结果对应于可观测量的特征值。...在对状态|>测量之后,得到结果的概率为若测量后,结果发生,则量子系统最新的状态为 ​投影测量有一个重要的特征就是很容易计算投影测量的平均值。这个公式它能够简化很多计算。观测量的平均值通常也记作。

    1K52

    View 的绘制过程

    测量 onMeasure onMeasure(int widthMeasureSpec,int heightMeasureSpec) 这个方法对于单控件来说,只是测量他自己,但是对于 ViewGroup...来说还要正确的给它的子控件传入期望的测量数值。...那么我们就需要自己计算出这个 View 想要的大小,然后和父布局给的最大的值做比较,选择一个值给 setMeasuredDimension() 那么如何获取此 ViewGroup 的正确高度呢?...也就是说需要我们给子 View 测量一下,测量的时候我们需要传入值。当然这个值也不是随便传入的,如果你随便传入的话,那么 child 的大小就乱了,和你在布局文件中设定的大小就不一样了。...执行完毕,DecorView 的 measure 就执行完毕了,到此整个页面的测量工作完成。

    63520

    从自定义ViewGroup看layout作用

    在该方法中,我们需要对我们的布局进行测量,并且将测量好的宽高传入setMeasuredDimension方法,完成测量。...里面包含了父View根据当前View的LayoutParams和父View的测量规格进行计算,得出的对当前View期望的测量模式和测量大小: 当测量模式为MeasureSpec.EXACTLY 也就是当宽或者高为确定值时...,那么当前布局View的宽高也就是设定为父View给我们设置好的测量大小即可。...当测量模式为MeasureSpec.AT_MOST 或者 UNSPECIFIED: 这时候,说明父View对当前View的要求不固定,是可以为任意大小或者不超过最大值的情况,比如设置这个VerticalLayout...super.onMeasure(widthMeasureSpec, heightMeasureSpec) //获取宽高的测量模式和测量大小 val widthMode

    53920

    重新复习Android View的绘制流程

    源码解析 MeasureSpec表示的是一个32位的整形值,它的高2位表示测量模式SpecMode,低30位表示某种测量模式下的规格大小SpecSize。...); ... } // 不同的ViewGroup子类有不同的布局特性,这导致它们的测量细节各不相同,如果需要自定义测量过程,则子类可以重写这个方法 protected void onMeasure...,onMeasure在view之中有默认的实现,一般继承ViewGroup的类会重写这个方法来改变测量的规则, view的onMeasure会调用getDefaultSize来测量尺寸,也就是人们一般说自定义控件...heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 获取宽-测量规则的模式和大小...MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); // 获取高-测量规则的模式和大小

    42020

    View绘制流程

    具体分析 measure 过程由measure(int, int)方法发起,从上到下有序的测量 View,在 measure 过程的最后,每个视图存储了自己的尺寸大小和测量规格。...而且这两个值必须在父视图约束范围之内,这样才可以保证所有的父视图都接收所有子视图的测量。如果子视图对于 Measure 得到的大小不满意的时候,父视图会介入并设置测量规则进行第二次 measure。...比如,父视图可以先根据未给定的 dimension 去测量每一个子视图,如果最终子视图的未约束尺寸太大或者太小的时候,父视图就会使用一个确切的大小再次对子视图进行 measure。...measure 过程传递尺寸的两个类 ViewGroup.LayoutParams (View 自身的布局参数) MeasureSpecs 类(父视图对子视图的测量要求) ViewGroup.LayoutParams...requestLayout() 当布局变化的时候,比如方向变化,尺寸的变化,会调用该方法,在自定义的视图中,如果某些情况下希望重新测量尺寸大小,应该手动去调用该方法,它会触发measure()和layout

    84150
    领券