自定义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>