Java 如何以编程方式将视图居中放置在布局上?
我正在制作一些游戏来学习更多关于Java和AStudio的知识。我需要将一个视图居中到另一个视图。两个视图都是约束视图。我已经尝试过在更改大小的同时匹配父视图或换行内容,但较小的视图将始终换行到父视图中的0,0位置。如果我在子视图上使用“setX/setY”,它会在父视图或主视图布局上工作吗?无论如何,我知道它是一个android视图属性,以某种方式使用重力或smth使孩子居中,但我在任何地方都找不到正确的答案Java 如何以编程方式将视图居中放置在布局上?,java,android,layout,view,Java,Android,Layout,View,我正在制作一些游戏来学习更多关于Java和AStudio的知识。我需要将一个视图居中到另一个视图。两个视图都是约束视图。我已经尝试过在更改大小的同时匹配父视图或换行内容,但较小的视图将始终换行到父视图中的0,0位置。如果我在子视图上使用“setX/setY”,它会在父视图或主视图布局上工作吗?无论如何,我知道它是一个android视图属性,以某种方式使用重力或smth使孩子居中,但我在任何地方都找不到正确的答案 public class GameField extends ConstraintL
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;
}
}
public class游戏场扩展了ConstraintLayout{。。。
公共类GameUnit扩展了ConstraintLayout{。。。
...
...
私有void deployClick(){
int sizeUnit=960/boardSizeX;
int x=4;
对于(LayoutParam
s)的(int i=0;i经验法则:它们以父布局命名。因此对于内部自定义视图
,您需要设置ConstraintLayout.LayoutParams
:
ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(sizeUnit - 5, sizeUnit - 5);
gameUnit[counterUnits].setLayoutParams(lp);
gameField[randCounter].addView(gameUnit[counterUnits]);
由于外部自定义的视图
扩展自ConstraintLayout
,因此可以使用ConstraintSet
来正确定位内部视图
。它们使用视图
id,因此需要通过调用setId(View.generateWiid())为动态添加的视图
提供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);
首先将装置视图
添加到字段视图
,然后调用
cs.applyTo(gameField[randCounter])
gameField[randCounter].setUnitAdded(true)
deployClicked = true
LayoutParam
s的经验法则:它们以父布局命名。因此,对于内部自定义视图
,您需要设置ConstraintLayout.LayoutParams
:
ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(sizeUnit - 5, sizeUnit - 5);
gameUnit[counterUnits].setLayoutParams(lp);
gameField[randCounter].addView(gameUnit[counterUnits]);
由于外部自定义的视图
扩展自ConstraintLayout
,因此可以使用ConstraintSet
来正确定位内部视图
。它们使用视图
id,因此需要通过调用setId(View.generateWiid())为动态添加的视图
提供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);
首先将装置视图
添加到字段视图
,然后调用
cs.applyTo(gameField[randCounter])
gameField[randCounter].setUnitAdded(true)
deployClicked = true
我刚刚检查了setX/Y方法,这些方法将在父级上运行,但必须有另一种方法。我希望避免额外的位置计算,尤其是在所有内容都是动态的情况下。我刚刚检查了setX/Y方法,这些方法将在父级上运行,但必须有另一种方法。我希望避免额外的位置计算尤其是当一切都是动态的时候。