如果需要在布局中创造一个层叠的概念,那么使用Android系统中的ViewGroup是不够的,但是可以通过改变ViewGroup的绘制顺序实现
代码下载
<强>继承自FrameLayout 强>
FrameLayout已经帮我们实现了子视图的度量和布局过程,我们只需在它的基础上改变绘制顺序即可
<>强自定义LayoutParams 强>
layoutParams的作用是向父布局请求布局参数(MeasureSpec),这个参数会在视图膨胀时添加到布局中,我们如果使用layoutParams将会得到很大的方便
//这里继承FrameLayout的LayoutParams即可 公共静态类LayoutParams FrameLayout延伸。LayoutParams { 最后公共静态int DEFAULT_ZORDER=1; 公共int zOrder; 公共LayoutParams (@NonNull上下文c, @Nullable AttributeSet attrs) { 超级(c, attrs); TypedArray=c。obtainStyledAttributes (attrs R.styleable.ZOrderLayout); zOrder=a.getInt (R.styleable。ZOrderLayout_layout_zorder DEFAULT_ZORDER); a.recycle (); } }
我们自定义个属性,那么就可以在XML中进行使用了
& lt; declare-styleable name=" ZOrderLayout比; & lt; attr name==罢?發ayout_zorder”格式比; & lt;/declare-styleable>
这样我们的观点就可以这么使用
& lt; !——layout_zorder表示该视图在第1层,在 & lt; tianrui.viewgroup.MyTextView android:文本=" 0 " android: layout_width=" 50 dp” android: layout_height=" 50 dp” android:背景=" @android:颜色/holo_red_light” 应用:layout_zorder=" 1 "/比; & lt; !——layout_zorder=2表示该视图在第2层,在 & lt; tianrui.viewgroup.MyTextView android:文本=" 1 " android: layout_width=" 50 dp” android: layout_height=" 50 dp” android: layout_marginLeft=" 20 dp” android:背景=" @android:颜色/holo_blue_light” 应用:layout_zorder=" 2 "/祝辞
同时需要重写ViewGroup的generateLayoutParams(),让它生成我们的LayoutParams
<强>初始化绘制顺序强>
在所有的子视图加载完成后初始化需要绘制的顺序(根据我们的ZorderLayoutParams)
@Override 保护空白> @Override 保护int getChildDrawingOrder (int childCount int i) { 返回indexOfChild (list.get(我)当代); }
演示演示
& lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比; & lt; tianrui.viewgroup.view.ZOrderLayout xmlns: android=" http://schemas.android.com/apk/res/android " xmlns:应用=" http://schemas.android.com/apk/res-auto " android: layout_width=" match_parent " android: layout_height=癿atch_parent”比; & lt; tianrui.viewgroup.MyTextView android:文本=" 0 " android: layout_width=" 50 dp” android: layout_height=" 50 dp” android:背景=" @android:颜色/holo_red_light” 应用:layout_zorder=" 1 "/比; & lt; tianrui.viewgroup.MyTextView android:文本=" 1 " android: layout_width=" 50 dp” android: layout_height=" 50 dp” android: layout_marginLeft=" 20 dp” android:背景=" @android:颜色/holo_blue_light” 应用:layout_zorder=" 2 "/比; & lt; tianrui.viewgroup.MyTextView android:文本=" 2 " android: layout_width=" 50 dp” android: layout_height=" 50 dp” android: layout_marginLeft=" 40 dp " android:背景=" @android:颜色/holo_orange_light” 应用:layout_zorder=3/比; & lt; tianrui.viewgroup.MyTextView android:文本=" 3 " android: layout_width=" 50 dp” android: layout_height=" 50 dp” android: layout_marginLeft=" 60 dp " android:背景=" @android:颜色/holo_green_light” 应用:layout_zorder=" 2 "/比; & lt; tianrui.viewgroup.MyTextView android:文本=" 4 " android: layout_width=" 50 dp” android: layout_height=" 50 dp” android: layout_marginLeft=" 80 dp” android:背景=" @android:颜色/holo_purple” 应用:layout_zorder=" 1 "/比; & lt;/tianrui.viewgroup.view.ZOrderLayout>
可以看出这个布局是中间的zorder最高,表示中间的会压在两边的上边,而最左(右)的绘制层级(zorder)为1,表示会绘制在最下面