自定义ViewGroup

参考:Android中View绘制流程以及invalidate()等相关方法分析

https://www.wanandroid.com/route/show/573

 

1、ViewGroup 与 LayoutParams 关系:

大家可以回忆一下,当在LinearLayout中写childView的时候,可以写layout_gravity,layout_weight属性;在RelativeLayout中的childView有layout_centerInParent属性,却没有layout_gravity,layout_weight,这是为什么呢?这是因为每个ViewGroup需要指定一个LayoutParams,用于确定支持childView支持哪些属性,比如LinearLayout指定LinearLayout.LayoutParams等。如果大家去看LinearLayout的源码,会发现其内部定义了LinearLayout.LayoutParams,在此类中,你可以发现weight和gravity的身影。

2、ViewGroupA 嵌套 B 嵌套 ViewC 。A B C  的layouparams 分别是什么?

均是其父布局的layoutparams。

如groupB.layoutParams属性类型 是 A的内部类A.LayoutParams,viewC.layoutParams 是 B的内部类B.LayoutParams

3、ViewGroup 加载自定义布局


public class UserView extends LinearLayout{

public UserView(@NonNull Context context) {
this(context, (AttributeSet) null);
}

public UserView(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public UserView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        LayoutInflater.from(context).inflate(R.layout.view_user, this, true);
    }

将view_user添加到当前viewgroup中。R.layout.view_user使用merge标签,减少层级绘制

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <ImageView
        android:layout_gravity="center_vertical"
        android:id="@+id/avatars"
        android:layout_width="40px"
        android:layout_height="40px"
        android:src="@drawable/user_account" />

    <TextView
        android:id="@+id/user"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="4px"
        android:gravity="center_vertical"
        android:text="未登录"
        android:textColor="@color/status_bar_text_color"
        android:textSize="22px" />

</merge>

参考:封装ViewGroup的优化建议

 

posted @ 2023-01-28 11:36  随易来了  阅读(59)  评论(0编辑  收藏  举报