我正在制作一些游戏,以了解有关Java和AStudio的更多信息。我需要将一个视图集中到另一个视图上。这两个视图都是ConstraintLayouts。我已经尝试过MATCH_PARENT或WRAP_CONTENT以及更改大小,但是较小的视图将始终在父视图中包装到0,0位置。如果我在子视图上使用“ setX / setY”,它将在父视图或主视图布局上工作吗?无论如何,我知道它是一个android view属性,可以使用重力或水平度以某种方式使孩子居中,但是我在任何地方都找不到正确的答案。
public class GameField extends ConstraintLayout {...
public class GameUnit extends ConstraintLayout {...
...
...
private void deployClick(){
int sizeUnit = 960/boardSizeX;
int x = 4;
for (int i =0; i<x;i++){
int randCounter = randomNum.nextInt(counterFields);
counterUnits++;
gameUnit[counterUnits] = new GameUnit(this,randomNum.nextInt(4),randomNum.nextInt(10),randomNum.nextInt(10));
gameUnit[counterUnits].setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
gameUnit[counterUnits].setLayoutParams(new android.view.ViewGroup.LayoutParams(sizeUnit-5,sizeUnit-5));
gameField[randCounter].addView(gameUnit[counterUnits]);
gameField[randCounter].setUnitAdded(true);
deployClicked = true;
}
}
答案 0 :(得分:0)
LayoutParam
的经验法则:它们以父级布局命名。因此,对于内部自定义View
,您需要设置ConstraintLayout.LayoutParams
:
ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(sizeUnit - 5, sizeUnit - 5);
gameUnit[counterUnits].setLayoutParams(lp);
gameField[randCounter].addView(gameUnit[counterUnits]);
由于外部定制View
从ConstraintLayout
扩展,因此您可以使用ConstraintSet
正确定位内部View
。他们使用View
ID,因此您需要通过在其上调用View
来为动态添加的setId(View.generateViewId())
s提供ID。然后,您可以按照以下步骤操作:
int unitId = gameUnit[counterUnits].getId();
int fieldId = gameField[randCounter].getId();
ConstraintSet cs = new ConstraintSet();
cs.connect(unitId, ConstraintSet.START, fieldId, ConstraintSet.START)
cs.connect(unitId, ConstraintSet.END, fieldId, ConstraintSet.END)
cs.connect(unitId, ConstraintSet.TOP, fieldId, ConstraintSet.TOP)
cs.connect(unitId, ConstraintSet.BOTTOM, fieldId, ConstraintSet.BOTTOM)
cs.constrainHeight(unit.id, lp.height);
cs.constrainWidth(unit.id, lp.width);
首先将单位View
添加到字段View
,然后调用
cs.applyTo(gameField[randCounter])
gameField[randCounter].setUnitAdded(true)
deployClicked = true