簡體   English   中英

如何使用對齊方式輸出文本

[英]How to output text with a justify alignment

我正在嘗試為libgdx創建一個組件,它可以以與html對<p align=”justify”> ... </p>相同的方式輸出文本。

我的想法是添加一些自定義組件,可以通過調整組件的相對x和y協調來實現這一點。

import java.util.ArrayList;
import java.util.List;

import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
import com.badlogic.gdx.scenes.scene2d.ui.WidgetGroup;
import com.badlogic.gdx.utils.Align;

public class Paragraph extends WidgetGroup {

    private Label space;

    public Paragraph(String text, float width, LabelStyle style) {

        super();
        setWidth(width);

        this.space = new Label(" ", style);
        this.space.pack();

        String[] words = text.split(" ");
        for (String word : words) {

            Label label = new Label(word, style);
            label.pack();

            addActor(label);
        }    
    }

    public void layout () {

        float size = 0;
        List<Actor> elements = new ArrayList<Actor>();

        float x = getX(Align.topLeft);
        float y = getY(Align.topLeft);

        for (Actor actor : this.getChildren().items) {

            if (actor != null) {
                if (elements.isEmpty()) {
                    elements.add(actor);
                    size = actor.getWidth();

                } else {

                    if (size + space.getWidth() + actor.getWidth() <= this.getWidth()) {

                        elements.add(actor);
                        size += (space.getWidth() + actor.getWidth());

                    } else {

                        float spacing = space.getWidth() + ((getWidth() - size) / elements.size());

                        Actor element = elements.get(0);
                        element.setPosition(x, y, Align.topLeft);

                        x += element.getWidth();

                        for (int i = 1; i < elements.size(); i++) {
                            element = elements.get(i);
                            element.setPosition(x + spacing, y, Align.topLeft);

                            x += (spacing + element.getWidth());
                        }

                        // new line
                        elements.clear();
                        x = getX(Align.topLeft);
                        y += (this.space.getHeight() * 1.5);

                        elements.add(actor);
                        size = actor.getWidth();
                    }
                }
            }
        }

        if (elements.isEmpty() == false) {

            float spacing = space.getWidth();

            Actor element = elements.get(0);
            element.setPosition(x, y, Align.topLeft);

            x += element.getWidth();

            for (int i = 1; i < elements.size(); i++) {
                element = elements.get(i);
                element.setPosition(x + spacing, y, Align.topLeft);

                x += (spacing + element.getWidth());
            }
        }
    }
}

我的問題是我用getX(Align.topLeft)和getY(Align.topLeft)檢索的x和y坐標總是返回(0,0)而不是舞台上的真實坐標。

組件結構如下所示:

Stage
+ Container
  + Table
    + ScrollPane
      + Table
        + Table
          + Paragraph
          + Paragraph
          + Paragraph
          + Paragraph
        + Image

因此,最終結果是不同段落中包含的所有文本都是相互疊加的。 不在位置(0,0)上,而是在周圍桌子內的相同位置。

我自己想通了。

似乎覆蓋布局方法是個壞主意。 我現在從構造函數調用一個不同的方法。

我也搞砸了x和y坐標,所以我不得不重寫那個方法。

Ps。:我也調整了問題,因為我發現了解決方案,它並不是關於小組組的x和y坐標。

import java.util.ArrayList;
import java.util.List;

import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
import com.badlogic.gdx.scenes.scene2d.ui.WidgetGroup;
import com.badlogic.gdx.utils.Align;

public class Paragraph extends WidgetGroup {

    private static final class RowData {

        final List<Actor> elements;
        final float size;
        final boolean lastRow;

        RowData(List<Actor> elements, float size, boolean lastRow) {
            this.elements = elements;
            this.size = size;
            this.lastRow = lastRow;
        }

        static RowData createNewRow(List<Actor> elements, float size) {
            return new RowData(elements, size, false);
        }

        static RowData createLastRow(List<Actor> elements, float size) {
            return new RowData(elements, size, true);
        }
    }

    private Label space;

    public Paragraph(String text, float width, LabelStyle style) {

        super();
        setWidth(width);

        this.space = new Label(" ", style);
        this.space.pack();

        String[] words = text.split(" ");
        for (String word : words) {

            Label label = new Label(word, style);
            label.pack();

            addActor(label);
        }

        arrangeActors();
    }

    private void arrangeActors() {

        float size = 0;
        float height = space.getHeight();

        List<RowData> rows = new ArrayList<RowData>(); 
        List<Actor> elements = new ArrayList<Actor>();

        Actor[] actors = this.getChildren().begin();

        for (Actor actor : actors) {

            if (actor != null) {
                if (elements.isEmpty()) {

                    elements.add(actor);
                    size = actor.getWidth();

                } else if (size + space.getWidth() + actor.getWidth() <= this.getWidth()) {

                    elements.add(actor);
                    size += (space.getWidth() + actor.getWidth());

                } else {

                    rows.add(RowData.createNewRow(elements, size));

                    elements = new ArrayList<Actor>();
                    height += space.getHeight();

                    elements.add(actor);
                    size = actor.getWidth();
                }
            }
        }

        this.getChildren().end();

        rows.add(RowData.createLastRow(elements, size));

        height += space.getHeight();
        setHeight(height);

        float y = height;

        for (RowData data : rows) {

            float spacing = space.getWidth();
            if (data.lastRow == false) {
                spacing += ((getWidth() - data.size) / data.elements.size()); 
            }

            Actor element = data.elements.get(0);
            element.setPosition(0, y, Align.topLeft);

            float x = element.getWidth();

            for (int i = 1; i < data.elements.size(); i++) {

                element = data.elements.get(i);                
                element.setPosition(x + spacing, y, Align.topLeft);
                x += (spacing + element.getWidth());
            }

            y -= this.space.getHeight();
        }
    }

    @Override
    public float getPrefWidth () {
        return getWidth();
    }

    @Override
    public float getPrefHeight () {
        return getHeight();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM