Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式将视图居中放置在布局上?_Java_Android_Layout_View - Fatal编程技术网

Java 如何以编程方式将视图居中放置在布局上?

Java 如何以编程方式将视图居中放置在布局上?,java,android,layout,view,Java,Android,Layout,View,我正在制作一些游戏来学习更多关于Java和AStudio的知识。我需要将一个视图居中到另一个视图。两个视图都是约束视图。我已经尝试过在更改大小的同时匹配父视图或换行内容,但较小的视图将始终换行到父视图中的0,0位置。如果我在子视图上使用“setX/setY”,它会在父视图或主视图布局上工作吗?无论如何,我知道它是一个android视图属性,以某种方式使用重力或smth使孩子居中,但我在任何地方都找不到正确的答案 public class GameField extends ConstraintL

我正在制作一些游戏来学习更多关于Java和AStudio的知识。我需要将一个视图居中到另一个视图。两个视图都是约束视图。我已经尝试过在更改大小的同时匹配父视图或换行内容,但较小的视图将始终换行到父视图中的0,0位置。如果我在子视图上使用“setX/setY”,它会在父视图或主视图布局上工作吗?无论如何,我知道它是一个android视图属性,以某种方式使用重力或smth使孩子居中,但我在任何地方都找不到正确的答案

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方法,这些方法将在父级上运行,但必须有另一种方法。我希望避免额外的位置计算尤其是当一切都是动态的时候。