在视图组中的TopLeft和BottomRight设置子视图

时间:2013-05-06 01:11:31

标签: android layout view viewgroup

在我的应用程序中,我有这样的布局:

1)可以移动和拖动主视图。

2)可以在主视图内添加一些控制器。他们的位置可以设置为TopLeft或其他。这里的TopLeft表示相对于主视图。(参见this image

现在我尝试通过扩展ViewGroup来实现这一点,main Viewcontrollers都来自View

这就是我现在所做的:

class MyViewContainer extends ViewGroups{
   @Override
   public void onLayout(boolean changed,int l,int t,int b, int r){

      for(int i=0,len=getChildCounts,i<len;i++){
        View v=getChildAt(i);
        if(v instanceof MainView){
           v.layout(l,t,b,r);
        }
        else if(v instanceof MyController){
          //here do not now know how to layout the childs according to their position
        }
      }
   }
}
abstract MyController extends View{
}
class ZoomController extends MyController{
    @Override
    public void onDraw(Canvas c){

    }
}
class AnotherController extends MyController{
    @Override
    public void onDraw(Canvas c){

    }
}
class MainView extends View{
    @Override
    public void onDraw(Canvas c){

    }
}

如您所见,我不知道布局MyControllers。因为我不完全知道controller的宽度和高度。因为控制器的大小取决于它的绘制方式。

如何制作?

1 个答案:

答案 0 :(得分:0)

试试这个。为此,主视图必须位于控制器之前。

class MyViewContainer extends ViewGroups{
    @Override
    public void onLayout(boolean changed,int l,int t,int b, int r){
        View masterView = null;
        for(int i=0,len=getChildCounts,i<len;i++){
            View v=getChildAt(i);
            if(v instanceof MainView){
                masterView = v;
                v.layout(l,t,b,r);
            }
            else if(v instanceof MyController){
                // Layout your views here.
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                if (masterView != null && topLeft) {
                    params.addRule(RelativeLayout.ALIGN_LEFT, masterView.getId());
                    params.addRule(RelativeLayout.ALIGN_TOP, masterView.getId());
                }
                if (masterView != null && bottomRight) {
                    params.addRule(RelativeLayout.ALIGN_RIGHT, masterView.getId());
                    params.addRule(RelativeLayout.ALIGN_BOTTOM, masterView.getId());
                }
                v.setLayoutParams(params);
            }
        }
    }
}