requestLayout();
在view 中调用requestLayout();view会重新计算大小,也就是会重新执行onMeasure 方法。在onMeasure中调用 setMeasuredDimension(tempWidth, tempHeight); 就会重新设定view的大小
setMeasuredDimension(tempWidth, tempHeight);
背景:楼主本人的电脑在某一段时间使用过程中,只要一启动模拟器上我们的APP,电脑散热风扇的声音就加大,cpu占用率上升到30%-50%。同时APP界面操作不流畅。
刚开始没有注意,最后发现在实体机上(公司对接的实体机配置垃圾)拖动控件,动画展示都很不流畅。所以开始找原因。
打开Profiler,发现程序cpu占用居高不下, record之后,发现占用cpu90%以上时间的是onmeasure和childLayout方法。开始分析,最终定位到一个自定义的view上。
这个自定义view在onDraw方法中,调用了一个很不起眼的方法:setLayoutParams. 将这个方法去掉之后,界面滑动
这个时候时候我们应该在加载webview的时候,重新设置webview高度,该高度=activity高度-下面tag高度,代码如下
int hight=context.mainLayout.getHeight();
if(context.tabLinearLayout.getVisibility()==Vi
1 onMeasure什么时候会被调用
onMeasure方法的作用是测量控件的大小,当我们创建一个View(执行构造方法)的时候不需要测量控件的大小,只有将这个view放入一个容器(父控件)中的时候才需要测量,而这个测量方法就是父控件唤起调用的。当控件的父控件要放置该控件的时候,父控件会调用子控件的onMeasure方法询问子控件:“你有多大的尺寸,我要给你多大的地方才能容纳你?”,然后传入两个参数(widthMeasureSpec和heightMeasureSpec),这两个参数就是父控件告诉子控件可获
Android开发过程中,由于个性化的需求越来越多,原生的系统的View已经不能满足于产品的需要。所以开发过程中自定义View已经是家常便饭.在自定义View中我们经常会用重绘和更新常用的方法有 invalidate、requestLayoutinvalidate方法会执行draw过程,重绘View树。View执行requestLayout方法,会向上递归到顶级父View中,再执行这个顶级父Vie...
onMeasure使用的是父类的处理方法,如果我们需要解决 自定义View的大小,可以尝试下面的方法
view plaincopy to clipboardprint?
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
height = View
View的三大流程:测量,布局,绘制,自定义View学的是啥?无非就两种:绘制文字和绘制图像。
我们在上一篇文章《Android绘图之Paint的使用》中学习了Paint的基本用法,但是具体的应用我们还没有实践过。从标题中可知,本文是带领读者使用Paint,自定义一个进度条控件。
上图就是本文要实现的效果图。
既然是自定义控件,本文的该控件是直接继承View,然后重写View的onMeasure和onDraw方法来实现。其中onMeasure主要作用是测量控件的宽/高。而onDraw则是将界面绘制到屏幕上。
从效果的效果上看,我们需要自定义一些属性,如:进度度条的颜
对于 Activity 中 view 的测量,布局,绘制三个过程大部分人都已经比较熟悉了,这里我们直接从一个 Activity 如何开始这三个过程开始找到问题。
第一次测量在什么时候?
那我们需要先知道 ViewRo...
这是一片工作日志记录,用的比较多所以记录下来,免得下次又来写。
绘制过程都是在ondraw方法中执行,思路是首先通过drawCircle画灰色底图,然后通过drawArc画粉色进度条,这中间涉及到这两个api的绘制时候的半径问题,主要是arc弧形与它的外切Rect的重合部分要在半径中去除以达到重合效果。
onMeasure中使用来读取xml中写到的半径,并使用宽高的最小尺寸作为最后的半径,此代...
<br />//mLogin 是一个FrameLayout 布局view,对应的还有LinearLayout.LayoutParams,RelativeLayout.LayoutParams等<br />FrameLayout.LayoutParams linearParams = (FrameLayout.LayoutParams) mLogin.getLayoutParams();<br />linearParams.height = 200;<br />mlogin.setLayoutParams(l