Přizpůsobení tvarů prezentace na Androidu

Přehled

Tento článek vysvětluje, jak přizpůsobit tvary prezentace v Aspose.Slides úpravou geometrie tvaru pomocí editačních bodů a geometrických cest. Ukazuje, jak pracovat s GeometryPath a IGeometryPath pro úpravu existujících tvarů, provádění základních operací úpravy cest, přidávání nebo odstraňování bodů a aplikaci aktualizované geometrie zpět na tvar.

Také demonstruje, jak vytvářet vlastní a složené tvary, stavět tvary s zakřivenými rohy, zjistit, zda je geometrie tvaru uzavřená, a převádět mezi GeometryPath a java.awt.Shape pro další scénáře přizpůsobení geometrie.

Změna tvaru pomocí editačních bodů

Uvažujme čtverec. V PowerPointu můžete pomocí editačních bodů

  • posunout roh čtverce dovnitř nebo ven,
  • zadat zakřivení pro roh nebo bod,
  • přidat nové body do čtverce,
  • manipulovat s body na čtverci atd.

V podstatě můžete provádět popsané úkoly na jakémkoli tvaru. Pomocí editačních bodů můžete tvar změnit nebo vytvořit nový tvar z existujícího.

Tipy pro úpravu tvarů

overview_image

Než začnete upravovat tvary PowerPointu pomocí editačních bodů, zvažte následující body o tvarech:

  • Tvar (nebo jeho cesta) může být buď uzavřený, nebo otevřený.
  • Když je tvar uzavřený, nemá počáteční ani koncový bod. Když je tvar otevřený, má začátek i konec.
  • Všechny tvary se skládají alespoň ze 2 kotvicových bodů spojených čarami.
  • Čára je buď přímá, nebo zakřivená. Kotvicové body určují povahu čáry.
  • Kotvicové body existují jako rohové body, přímé body nebo hladké body:
    • Rohový bod je bod, kde se dva přímé úseky setkávají pod úhlem.
    • Hladký bod je bod, kde jsou dva úchyty v jedné přímce a úseky čáry se spojují do hladké křivky. V tomto případě jsou všechny úchyty od kotvicového bodu odděleny stejnou vzdáleností.
    • Přímý bod je bod, kde jsou dva úchyty v jedné přímce a úseky čáry se spojují do hladké křivky. V tomto případě nemusí být úchyty od kotvicového bodu odděleny stejnou vzdáleností.
  • Posunutím nebo úpravou kotvicových bodů (což mění úhel čar) můžete změnit vzhled tvaru.

Pro úpravu tvarů PowerPointu pomocí editačních bodů poskytuje Aspose.Slides třídu GeometryPath a rozhraní IGeometryPath.

Jednoduché operace úpravy

Tento Java kód ukazuje, jak

Přidat čáru na konec cesty

public void lineTo(java.awt.geom.Point2D.Float point);
public void lineTo(float x, float y);

Přidat čáru na určenou pozici v cestě:

public void lineTo(java.awt.geom.Point2D.Float point, long index);
public void lineTo(float x, float y, long index);

Přidat kubickou Bézierovu křivku na konec cesty:

public void cubicBezierTo(java.awt.geom.Point2D.Float point1, java.awt.geom.Point2D.Float point2, java.awt.geom.Point2D.Float point3);
public void cubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3);

Přidat kubickou Bézierovu křivku na určenou pozici v cestě:

public void cubicBezierTo(java.awt.geom.Point2D.Float point1, java.awt.geom.Point2D.Float point2, java.awt.geom.Point2D.Float point3, long index);
public void cubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3, long index);

Přidat kvadratickou Bézierovu křivku na konec cesty:

public void quadraticBezierTo(java.awt.geom.Point2D.Float point1, java.awt.geom.Point2D.Float point2);
public void quadraticBezierTo(float x1, float y1, float x2, float y2);

Přidat kvadratickou Bézierovu křivku na určenou pozici v cestě:

public void quadraticBezierTo(java.awt.geom.Point2D.Float point1, java.awt.geom.Point2D.Float point2, long index);
public void quadraticBezierTo(float x1, float y1, float x2, float y2, long index);

Připojit daný oblouk k cestě:

public void arcTo(float width, float heigth, float startAngle, float sweepAngle);

Uzavřít aktuální figurku cesty:

public void closeFigure();

Nastavit pozici pro další bod:

public void moveTo(java.awt.geom.Point2D.Float point);
public void moveTo(float x, float y);

Odstranit segment cesty na daném indexu:

public void removeAt(int index);

Přidání vlastních bodů do tvaru

  1. Vytvořte instanci třídy GeometryShape a nastavte typ ShapeType.Rectangle.
  2. Získejte instanci třídy GeometryPath ze tvaru.
  3. Přidejte nový bod mezi dva horní body v cestě.
  4. Přidejte nový bod mezi dva spodní body v cestě.
  5. Aplikujte cestu na tvar.

Tento Java kód ukazuje, jak přidat vlastní body do tvaru:

Presentation pres = new Presentation();
try {
    GeometryShape shape = (GeometryShape) pres.getSlides().get_Item(0).
            getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 200, 100);
    IGeometryPath geometryPath = shape.getGeometryPaths()[0];

    geometryPath.lineTo(100, 50, 1);
    geometryPath.lineTo(100, 50, 4);
    shape.setGeometryPath(geometryPath);
} finally {
    if (pres != null) pres.dispose();
}

example1_image

Odstranění bodů z tvaru

  1. Vytvořte instanci třídy GeometryShape a nastavte typ ShapeType.Heart.
  2. Získejte instanci třídy GeometryPath ze tvaru.
  3. Odstraňte segment cesty.
  4. Aplikujte cestu na tvar.

Tento Java kód ukazuje, jak odstranit body z tvaru:

Presentation pres = new Presentation();
try {
    GeometryShape shape = (GeometryShape) pres.getSlides().get_Item(0).
            getShapes().addAutoShape(ShapeType.Heart, 100, 100, 300, 300);

    IGeometryPath path = shape.getGeometryPaths()[0];
    path.removeAt(2);
    shape.setGeometryPath(path);
} finally {
    if (pres != null) pres.dispose();
}

example2_image

Vytvoření vlastního tvaru

  1. Spočítejte body pro tvar.
  2. Vytvořte instanci třídy GeometryPath.
  3. Naplňte cestu body.
  4. Vytvořte instanci třídy GeometryShape.
  5. Aplikujte cestu na tvar.

Tento Java kód ukazuje, jak vytvořit vlastní tvar:

List<Point2D.Float> points = new ArrayList<Point2D.Float>();

float R = 100, r = 50;
int step = 72;

for (int angle = -90; angle < 270; angle += step)
{
    double radians = angle * (Math.PI / 180f);
    double x = R * Math.cos(radians);
    double y = R * Math.sin(radians);
    points.add(new Point2D.Float((float)x + R, (float)y + R));

    radians = Math.PI * (angle + step / 2) / 180.0;
    x = r * Math.cos(radians);
    y = r * Math.sin(radians);
    points.add(new Point2D.Float((float)x + R, (float)y + R));
}

GeometryPath starPath = new GeometryPath();
starPath.moveTo(points.get(0));

for (int i = 1; i < points.size(); i++)
{
    starPath.lineTo(points.get(i));
}

starPath.closeFigure();

Presentation pres = new Presentation();
try {
    GeometryShape shape = (GeometryShape) pres.getSlides().get_Item(0).
            getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, R * 2, R * 2);

    shape.setGeometryPath(starPath);
} finally {
    if (pres != null) pres.dispose();
}

example3_image

Vytvoření složeného vlastního tvaru

  1. Vytvořte instanci třídy GeometryShape.
  2. Vytvořte první instanci třídy GeometryPath.
  3. Vytvořte druhou instanci třídy GeometryPath.
  4. Aplikujte cesty na tvar.

Tento Java kód ukazuje, jak vytvořit složený vlastní tvar:

Presentation pres = new Presentation();
try {
    GeometryShape shape = (GeometryShape) pres.getSlides().get_Item(0).
            getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 200, 100);

    GeometryPath geometryPath0 = new GeometryPath();
    geometryPath0.moveTo(0, 0);
    geometryPath0.lineTo(shape.getWidth(), 0);
    geometryPath0.lineTo(shape.getWidth(), shape.getHeight()/3);
    geometryPath0.lineTo(0, shape.getHeight() / 3);
    geometryPath0.closeFigure();

    GeometryPath geometryPath1 = new GeometryPath();
    geometryPath1.moveTo(0, shape.getHeight()/3 * 2);
    geometryPath1.lineTo(shape.getWidth(), shape.getHeight() / 3 * 2);
    geometryPath1.lineTo(shape.getWidth(), shape.getHeight());
    geometryPath1.lineTo(0, shape.getHeight());
    geometryPath1.closeFigure();

    shape.setGeometryPaths(new GeometryPath[] { geometryPath0, geometryPath1});
} finally {
    if (pres != null) pres.dispose();
}

example4_image

Vytvoření vlastního tvaru s zakřivenými rohy

Tento Java kód ukazuje, jak vytvořit vlastní tvar se zakřivenými rohy (dovnitř);

float shapeX = 20f;
float shapeY = 20f;
float shapeWidth = 300f;
float shapeHeight = 200f;

float leftTopSize = 50f;
float rightTopSize = 20f;
float rightBottomSize = 40f;
float leftBottomSize = 10f;

Presentation pres = new Presentation();
try {
    IAutoShape childShape = pres.getSlides().get_Item(0).getShapes().addAutoShape(
            ShapeType.Custom, shapeX, shapeY, shapeWidth, shapeHeight);

    GeometryPath geometryPath = new GeometryPath();

    Point2D.Float point1 = new Point2D.Float(leftTopSize, 0);
    Point2D.Float point2 = new Point2D.Float(shapeWidth - rightTopSize, 0);
    Point2D.Float point3 = new Point2D.Float(shapeWidth, shapeHeight - rightBottomSize);
    Point2D.Float point4 = new Point2D.Float(leftBottomSize, shapeHeight);
    Point2D.Float point5 = new Point2D.Float(0, leftTopSize);

    geometryPath.moveTo(point1);
    geometryPath.lineTo(point2);
    geometryPath.arcTo(rightTopSize, rightTopSize, 180, -90);
    geometryPath.lineTo(point3);
    geometryPath.arcTo(rightBottomSize, rightBottomSize, -90, -90);
    geometryPath.lineTo(point4);
    geometryPath.arcTo(leftBottomSize, leftBottomSize, 0, -90);
    geometryPath.lineTo(point5);
    geometryPath.arcTo(leftTopSize, leftTopSize, 90, -90);

    geometryPath.closeFigure();

    childShape.setGeometryPath(geometryPath);

    pres.save("output.pptx", SaveFormat.Pptx);
} finally {
    if (pres!= null) pres.dispose();
}

Zjištění, zda je geometrie tvaru uzavřená

Uzavřený tvar je definován jako takový, kde všechny jeho strany spojují a tvoří jediný okraj bez mezer. Takový tvar může být jednoduchou geometrickou formou nebo složitým vlastním obrysem. Následující ukázkový kód ukazuje, jak zkontrolovat, zda je geometrie tvaru uzavřená:

boolean isGeometryClosed(IGeometryShape geometryShape)
{
    Boolean isClosed = null;

    for (IGeometryPath geometryPath : geometryShape.getGeometryPaths()) {
        int dataLength = geometryPath.getPathData().length;
        if (dataLength == 0)
            continue;

        IPathSegment lastSegment = geometryPath.getPathData()[dataLength - 1];
        isClosed = lastSegment.getPathCommand() == PathCommandType.Close;

        if (isClosed == false)
            return false;
    }

    return isClosed == true;
}

Převod GeometryPath na java.awt.Shape

  1. Vytvořte instanci třídy GeometryShape.
  2. Vytvořte instanci třídy java.awt.Shape.
  3. Převěďte instanci java.awt.Shape na instanci GeometryPath pomocí ShapeUtil.
  4. Aplikujte cesty na tvar.

Tento Java kód – implementace výše uvedených kroků – demonstruje proces konverze GeometryPath na GraphicsPath:

Presentation pres = new Presentation();
try {
    // Vytvořit nový tvar
    GeometryShape shape = (GeometryShape)pres.getSlides().get_Item(0).
            getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 100);

    // Získat geometrickou cestu tvaru
    IGeometryPath originalPath = shape.getGeometryPaths()[0];
    originalPath.setFillMode(PathFillModeType.None);

    // Vytvořit novou grafickou cestu s textem
    Shape graphicsPath;
    Font font = new java.awt.Font("Arial", Font.PLAIN, 40);
    String text = "Text in shape";
    BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = img.createGraphics();

    try
    {
        GlyphVector glyphVector = font.createGlyphVector(g2.getFontRenderContext(), text);
        graphicsPath = glyphVector.getOutline(20f, ((float) -glyphVector.getVisualBounds().getY()) + 10);
    }
    finally {
        g2.dispose();
    }

    // Převést grafickou cestu na geometrickou cestu
    IGeometryPath textPath = ShapeUtil.graphicsPathToGeometryPath(graphicsPath);
    textPath.setFillMode(PathFillModeType.Normal);

    // Nastavit kombinaci nové geometrické cesty a původní geometrické cesty na tvar
    shape.setGeometryPaths(new IGeometryPath[] { originalPath, textPath });
} finally {
    if (pres != null) pres.dispose();
}

example5_image

Často kladené otázky

Co se stane s výplní a obrysem po nahrazení geometrie?

Styl zůstane spojený s tvarem; změní se pouze kontura. Výplň a obrys jsou automaticky aplikovány na novou geometrii.

Jak správně otočit vlastní tvar spolu s jeho geometrií?

Použijte metodu setRotation tvaru; geometrie se otáčí spolu s tvarem, protože je svázána se souřadnicovým systémem tvaru.

Mohu převést vlastní tvar na obrázek, aby byl „uzamčen“ výsledek?

Ano. Exportujte požadovanou slide oblast nebo samotný shape do rastrového formátu; to usnadňuje další práci s těžkými geometriemi.