在我的应用程序中,我有这样的布局:
1)可以移动和拖动主视图。
2)可以在主视图内添加一些控制器。他们的位置可以设置为TopLeft
或其他。这里的TopLeft
表示相对于主视图。(参见this image)
现在我尝试通过扩展ViewGroup
来实现这一点,main View
和controllers
都来自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
的宽度和高度。因为控制器的大小取决于它的绘制方式。
如何制作?
答案 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);
}
}
}
}