java - 如何以编程方式使 View 在布局上居中?

标签 java android layout view

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

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;
        }
    }

最佳答案

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,因此您需要通过调用 setId(View.generateViewId()) 为动态添加的 View 提供一个 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

关于java - 如何以编程方式使 View 在布局上居中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59144487/

相关文章:

android - 使用 WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH 获取所有 MotionEvents

android - 集成Paytm PGSDK_V2.0 Android

java - 如何在android中创建两个固定大小的 View 和跨越它们之间的一个 View ?

java - 向 Jframe 添加多个类

java - WAS 6.1 中的 Commons 日志记录仅记录到系统日志

java - 从 JSONArray 获取字符串到 String[] 或 List<String> 以输入到 ArrayList

java - 我应该为android中的类中的计算字段定义属性或函数吗?

java - 使用 Retrofit2 在 Recycleview 中得到空响应?

android - 使用 FCM 向订阅主题的所有设备发送推送通知(批量)时出现缩放问题

java - 使用多个 View /布局时在 Android 中处理触摸事件