【问题标题】:How do I programmatically center a view on the layout?如何以编程方式将视图置于布局的中心?
【发布时间】:2020-03-27 09:28:12
【问题描述】:

我正在制作一些游戏以了解有关 Java 和 AStudio 的更多信息。我需要将一个视图居中到另一个视图。两个视图都是 ConstraintLayouts。我已经尝试过 MATCH_PARENT 或 WRAP_CONTENT 以及更改大小,但较小的视图将始终包裹到父视图中的 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;
        }
    }

【问题讨论】:

  • 我刚刚检查了 setX/Y 方法,这些方法适用于父级,但必须有另一种方法。我想避免额外的位置计算,尤其是当一切都是动态的。

标签: java android layout view


【解决方案1】:

LayoutParams 的经验法则:它们以父布局命名。所以对于内部自定义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,因此您需要通过在它们上调用setId(View.generateViewId()) 来为您动态添加的Views 提供一个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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2018-09-19
    • 2019-12-18
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    相关资源
    最近更新 更多