如何设法在自定义视图组中将一个孩子带到另一个孩子面前?

时间:2014-06-11 16:50:03

标签: android android-layout layout

我在android中创建自己的自定义视图组。我有两个孩子。一个是linearLayout(它是第一个孩子,覆盖了屏幕的一半),上面有一些背景图像和按钮,另一个是View的扩展(它是第二个孩子并覆盖整个屏幕)我用手指画画。

我希望(第一个孩子)线性布局隐藏在视图的(第二个孩子)扩展名下面,以便我可以使用一些手势将第二个孩子滑动到右侧(有点像google,youtube的幻灯片) )并看到第一个孩子(LinearLayout)。问题出在 onLayout 里面我按照一定的顺序放置了孩子,但无论我做什么,第一个孩子(LinearLayout)总是在前面。

  secondchild.layout(0,0,top,bottom);
  firstchild.layout(0,0,top/2,bottom);

我也试过

  firstchild.layout(0,0,top/2,bottom);      
  secondchild.layout(0,0,top,bottom);

但第一个孩子总是名列前茅。

Costume ViewGroup代码:

public class RootViewLayout extends ViewGroup  {
      private View mDrawView;
      private View mSlideView;
      private int mTop;
      private int mDragRange;

      public RootViewLayout(Context context, AttributeSet attrs) {
          super(context, attrs);
      }
      @Override
      protected void onFinishInflate() {
          mDrawView  = findViewById(R.id.content_frame_white);
          mSlideView = findViewById(R.id.slide_frame);       
     }
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         int widthSize = MeasureSpec.getSize(widthMeasureSpec);
         int heightSize = MeasureSpec.getSize(heightMeasureSpec);
         setMeasuredDimension(widthSize, heightSize);   
     }
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom){
            bringChildToFront(mDrawView);
            mDrawView.layout(0, 0, right, bottom);
            mSlideView.layout(0, 0, right/2, bottom);   
     }
}

XML代码:

<com.example.drawapp.RootViewLayout 
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/Root_View_layout"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@color/white">
     <com.example.drawapp.DrawView
          android:id="@+id/content_frame_white"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:background="@drawable/whitepaperwithcoffeestain">    
     </com.example.drawapp.DrawView>
     <LinearLayout 
          android:id="@+id/slide_frame"
          android:layout_width="wrap_content"
          android:layout_height="match_parent"
          android:background="@drawable/slidebackgrd"
          android:orientation="vertical">
          <Button 
            android:id="@+id/pen"
            android:layout_width="100dip"
            android:layout_height="wrap_content"
            android:background="@drawable/pic"/>
      </LinearLayout>
</com.example.drawapp.RootViewLayout>

当我不放

   bringChildToFront(mDrawView);

空白被放置在适当的黑色背景下,但这不是我真正想要的。我希望用DrawView覆盖整个屏幕(背景为白色,上面有咖啡渍)。

是否有任何具体的方法告诉孩子们将其置于另一个之上?

1 个答案:

答案 0 :(得分:5)

您需要更改子视图的z顺序。您应该使用bringChildToFront(),即

parentLayout.bringChildToFront(secondChild);

但是,效果取决于父版面的类型(例如,如果它是LinearLayout,则视图将被交换)。由于你覆盖了我猜它意味着它是RelativeLayout,然后它应该可以正常工作。

我发现在您的情况下,您使用自定义ViewGroup。如果只是为了达到&#34;全宽/半宽&#34;孩子们,那我建议换一个RelativeLayout。添加secondchild match_parentfirstchild作为中心0dp视图的右侧,如Adjust width to half screen

或者另一个可能更简单的选择就是改变孩子的可见度(VISIBLE或GONE)。