web-dev-qa-db-ja.com

プログラムによるConstraintLayoutの子供のマージンとサイズの変更

カスタムXML属性を使用して、これらの属性に基づいてビューのマージンとサイズを設定できるように、カスタムビューを作成しています。ConstraintLayoutの子のマージンとサイズがカスタム値によって決定される部分に到達するまで、すべてが正常に機能しました。マージンは影響を与えず、ビューは親のConstraintLayoutの左上隅にとどまります。何が問題でしょうか? (画像は画面境界から500PX離れている必要があります)

if (hasCustomWidth || hasCustomHeight || hasCustomTopMargin || hasCustomRightMargin || hasCustomBottomMargin || hasCustomLeftMargin) {
    if(((ViewGroup)getParent()) instanceof  LinearLayout) {
        LinearLayout.LayoutParams newLayoutParams = new LinearLayout.LayoutParams((int) Math.round(customWidth), (int) Math.round(customHeight));
        ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) newLayoutParams;
        marginLayoutParams.setMargins((int) Math.round(customLeftMargin), (int) Math.round(customTopMargin), (int) Math.round(customRightMargin), (int) Math.round(customBottomMargin));
        setLayoutParams(newLayoutParams);
    } else if(((ViewGroup)getParent()) instanceof ConstraintLayout) {
        ConstraintLayout parentConstraintLayout = (ConstraintLayout)CustomAppCompatImageView.this.getParent();

        ConstraintLayout.LayoutParams newLayoutParams = new ConstraintLayout.LayoutParams((int) Math.round(customWidth), (int) Math.round(customHeight));

        ConstraintSet constraintSet = new ConstraintSet();

        constraintSet.clone(parentConstraintLayout);

        constraintSet.connect(CustomAppCompatImageView.this.getId(), ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT, 500);
        constraintSet.setMargin(CustomAppCompatImageView.this.getId(), ConstraintSet.LEFT, 500);

        setLayoutParams(newLayoutParams);
        constraintSet.applyTo(parentConstraintLayout);

        parentConstraintLayout.invalidate();
    } else {
        throw new RuntimeException("no listed parent LayoutParams subclass!");
    }

    invalidate();
}

結果:

enter image description here

15
chakmeshma

私は解決策を見つけました:明らかにAndroidは、ConstraintSet.LEFTConstraintSet.RIGHTを適切な引数として取りません。ConstraintSet.STARTConstraintSet.ENDで置き換える必要があります。

9
chakmeshma