android-layout - Android ConstraintLayout 性能改进 - 在行动中缺失
问题描述
我创建了一个自定义视图并插入了日志以进行估计的性能比较
public class CustomInAppKeyboard extends LinearLayoutCompat {
private static final String TAG = "MyKeyboard";
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(BuildConfig.DEBUG){
Log.e("CustomInAppKeyboard", "w:" + widthMeasureSpec + " :: " + MeasureSpec.toString(widthMeasureSpec));
Log.e("CustomInAppKeyboard", "h:" + heightMeasureSpec + " :: " + MeasureSpec.toString(heightMeasureSpec));
}
}
public CustomInAppKeyboard(Context context) {
this(context, null, 0);
}
public CustomInAppKeyboard(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomInAppKeyboard(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
LayoutInflater.from(context).inflate(R.layout.keyboard_alphanumeric, this, true);
}
}
然后使用“MyKeyboard”日志的开始和结束时间......我最终得到以下值:
- ConstraintLayout withguides 14.32
- 带链的 ConstraintLayout 13.62
- LinearLayout(嵌套权重)4.88
这是基于以下要点中的这些 xml 布局文件: - https://gist.github.com/CrandellWS/fc7946ea653cf90828580b3c00d8da57
那么如何让 ConstraintLayout 像嵌套的 LinearLayout 一样快速渲染呢?我可以做些什么不同或改变以使 ConstraintLayout 更接近地匹配 LinearLayout 性能?
请注意,无法在我的物理设备上使用 Systrace https://stackoverflow.com/a/52836747/1815624 ...因此是基本的性能测试方法...
解决方案
为了回答这个问题,我们不得不绕道而行。
我假设您已经阅读了有关ConstraintLayout
内部工作原理的信息,所以让我坚持重点。是的,我同意这ConstraintLayout
比这要慢,LinearLayout
但只有当子视图的数量较少时。
当你开始构建更大的布局时,比如包含 20-30 个视图,ConstraintLayout
它就派上用场了。如果您随后使用LinearLayout
或任何其他布局,比如说RelativeLayout
您最终将使用多个子ViewGroups
布局,您的布局图可能会像这样结束
LinearLayout(orientation vertical)
-> SomeChildView (let's say a TextView)
-> LinearLayout (orientation horizontal)
-> ChilView 1 -> ChildView 2
-> ImageView
-> ButtonView
-> ViewGroup (FrameLayout)
-> ImageView1
-> idk, maybe TextView?
而这样的例子不胜枚举。
现在,有了这种布局,传统的ViewGroups
最终计算的视图数量将超过ConstraintLayout
所以,我们可以得出一个结论,没有 ViewGroup 是完美的!!我们只需要根据我们的需要使用它们..
奖金!! ConstraintLayout
应该避免在内部RecyclerView
,因为它onMeasure()
比任何其他布局调用多次。
在将其应用到我的项目之前,我曾经做过一些研究。ConstraintLayout
推荐阅读
- javascript - Promise 如何在 Node.js 和 AWS lambda 函数中工作
- c - 执行直接操作时,输出值与函数内作为参数接收的值不同
- c# - 在 ASP.NET MVC 5 中使用 tinyMCE 获取和设置 html 格式
- ssis - 从 Excel 传输数据的 SSIS 无法检索表信息
- javascript - 在html中添加两个值的结果
- api - 将 API 输出中的 CSV 导入谷歌
- node.js - 在亚马逊 ec2 的 80 端口上服务节点 Webapp
- python-3.x - 如何在 Python 中查找用户给定字符串中的所有特殊字符?
- vb.net - 需要示例 HtmlAgilityPack
- python - 具有相似元素的对