Android实现Z轴布局效果

  

如果需要在布局中创造一个层叠的概念,那么使用Android系统中的ViewGroup是不够的,但是可以通过改变ViewGroup的绘制顺序实现

  

 Android实现Z轴布局效果

  

代码下载

  

<强>继承自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,表示会绘制在最下面

Android实现Z轴布局效果