首页 > 解决方案 > 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”日志的开始和结束时间......我最终得到以下值:

这是基于以下要点中的这些 xml 布局文件: - https://gist.github.com/CrandellWS/fc7946ea653cf90828580b3c00d8da57

那么如何让 ConstraintLayout 像嵌套的 LinearLayout 一样快速渲染呢?我可以做些什么不同或改变以使 ConstraintLayout 更接近地匹配 LinearLayout 性能?

“实际”键盘布局文件已知是不同的

请注意,无法在我的物理设备上使用 Systrace https://stackoverflow.com/a/52836747/1815624 ...因此是基本的性能测试方法...

标签: android-layoutandroid-constraintlayout

解决方案


为了回答这个问题,我们不得不绕道而行。

我假设您已经阅读了有关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


推荐阅读