Alakzatok testreszabása prezentációkban Androidon
Áttekintés
Ez a cikk bemutatja, hogyan testreszabhatók a megjelenítési alakzatok az Aspose.Slides‑ben úgy, hogy a forma geometriáját szerkesztőpontokkal és geometriai útvonalakkal módosítjuk. Megmutatja, hogyan használható a GeometryPath és az IGeometryPath meglévő alakzatok módosítására, alapvető útvonal‑szerkesztési műveletek végrehajtására, pontok hozzáadására vagy eltávolítására, valamint a frissített geometria alakzatra való alkalmazására.
Emellett bemutatja, hogyan hozhatók létre egyedi és összetett alakzatok, hogyan építhetők görbe sarkokkal rendelkező alakzatok, hogyan határozható meg, hogy egy alakzat geometriája zárt‑e, valamint hogyan konvertálható a GeometryPath és a java.awt.Shape egymásba további geometriák testreszabási forgatókönyveihez.
Alakzat módosítása szerkesztőpontokkal
Tekintsünk egy négyzetet. A PowerPointban szerkesztőpontok használatával a következőket tehetjük:
- a négyzet sarkát be‑ vagy kifelé mozgatni
- egy sarok vagy pont görbületét megadni
- új pontokat hozzáadni a négyzethez
- a négyzet pontjait manipulálni, stb.
Lényegében a leírt feladatok bármely alakzatra elvégezhetők. A szerkesztőpontok segítségével módosítható egy alakzat, vagy új alakzat hozható létre egy meglévőből.
Alakzatszerkesztési tippek

Mielőtt szerkesztenél PowerPoint‑alakzatokat szerkesztőpontokkal, vedd figyelembe a következőket az alakzatokkal kapcsolatban:
- Egy alakzat (vagy annak útvonala) lehet zárt vagy nyitott.
- Zárt alakzatnál nincs kezdeti vagy végpont, nyitott alakzatnál van kezdete és vége.
- Minden alakzat legalább 2 horgonypontból áll, amelyeket vonalak kötnek össze.
- A vonal lehet egyenes vagy íves. A horgonypontok határozzák meg a vonal jellegét.
- A horgonypontok lehetnek sarokpontok, egyenes pontok vagy sima pontok:
- Egy sarokpont az a pont, ahol 2 egyenes vonal szöget zár be.
- Egy sima pont az a pont, ahol 2 kontrolpont egyenes vonalban helyezkedik el, és a vonal szegmensei sima görbével csatlakoznak. Ilyenkor a kontrolpontok egyenlő távolságra vannak a horgonyponttól.
- Egy egyenes pont az a pont, ahol 2 kontrolpont egyenes vonalban található, de a vonal szegmensei nem feltétlenül csatlakoznak egyenlő távolságra a horgonyponttól.
- Horgonypontok mozgatásával vagy szerkesztésével (ami a vonalak szögét változtatja) megváltoztatható az alakzat megjelenése.
PowerPoint‑alakzatok szerkesztőpontokkal történő szerkesztéséhez az Aspose.Slides a GeometryPath osztályt és az IGeometryPath interfészt biztosítja.
- Egy GeometryPath példány a IGeometryShape objektum geometriai útvonalát reprezentálja.
- A
GeometryPathlekéréséhez aIGeometryShapepéldányból a IGeometryShape.getGeometryPaths metódust használhatod. - Egy alakzat
GeometryPath‑jának beállításához a következő metódusok állnak rendelkezésre: IGeometryShape.setGeometryPath szilárd alakzatok esetén és IGeometryShape.setGeometryPaths összetett alakzatok esetén. - Szegmensek hozzáadásához az IGeometryPath alatti metódusokat használhatod.
- Az IGeometryPath.setStroke és az IGeometryPath.setFillMode metódusokkal beállítható egy geometriai útvonal megjelenése.
- Az IGeometryPath.getPathData metódussal a
GeometryShapeútvonaladatai szegmens tömbként kérhetők le. - További alakzatgeometria‑testreszabási lehetőségek eléréséhez a GeometryPath konvertálható a java.awt.Shape típusra.
- A geometryPathToGraphicsPath és a graphicsPathToGeometryPath metódusok (a ShapeUtil osztályból) segítségével a GeometryPath visszakonvertálható a java.awt.Shape típusra és fordítva.
Egyszerű szerkesztési műveletek
Ez a Java‑kód bemutatja, hogyan
Adjunk hozzá egy vonalat egy útvonal végéhez
public void lineTo(java.awt.geom.Point2D.Float point);
public void lineTo(float x, float y);
Adjunk hozzá egy vonalat egy megadott pozícióban az útvonalon:
public void lineTo(java.awt.geom.Point2D.Float point, long index);
public void lineTo(float x, float y, long index);
Adjunk hozzá egy köbös Bézier‑görbét az útvonal végére:
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);
Adjunk hozzá egy köbös Bézier‑görbét a megadott pozícióba az útvonalon:
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);
Adjunk hozzá egy kvadratikus Bézier‑görbét az útvonal végére:
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);
Adjunk hozzá egy kvadratikus Bézier‑görbét a megadott pozícióba az útvonalon:
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);
Fűzzünk hozzá egy adott ívet az útvonalhoz:
public void arcTo(float width, float heigth, float startAngle, float sweepAngle);
Zárjuk le a jelenlegi alakzatot egy útvonalon:
public void closeFigure();
Állítsuk be a következő pont pozícióját:
public void moveTo(java.awt.geom.Point2D.Float point);
public void moveTo(float x, float y);
Távolítsuk el a szegmenst a megadott indexnél:
public void removeAt(int index);
Egyedi pontok hozzáadása egy alakzathoz
- Hozz létre egy példányt a GeometryShape osztályból, és állítsd be a ShapeType.Rectangle típust.
- Szerezz egy példányt a GeometryPath osztályból az alakzatról.
- Adj hozzá egy új pontot a két felső pont közé az útvonalon.
- Adj hozzá egy új pontot a két alsó pont közé az útvonalon.
- Alkalmazd az útvonalat az alakzatra.
Ez a Java‑kód mutatja, hogyan adhatunk egyedi pontokat egy alakzathoz:
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();
}

Pontok eltávolítása egy alakzatból
- Hozz létre egy példányt a GeometryShape osztályból, és állítsd be a ShapeType.Heart típust.
- Szerezz egy példányt a GeometryPath osztályból az alakzatról.
- Távolítsd el a szegmenst az útvonalból.
- Alkalmazd az útvonalat az alakzatra.
Ez a Java‑kód mutatja, hogyan távolíthatók el pontok egy alakzatból:
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();
}

Egyedi alakzat létrehozása
- Számold ki az alakzat pontjait.
- Hozz létre egy példányt a GeometryPath osztályból.
- Töltsd fel az útvonalat a pontokkal.
- Hozz létre egy példányt a GeometryShape osztályból.
- Alkalmazd az útvonalat az alakzatra.
Ez a Java‑kód bemutatja, hogyan hozhatsz létre egy egyedi alakzatot:
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();
}

Összetett egyedi alakzat létrehozása
- Hozz létre egy példányt a GeometryShape osztályból.
- Hozz létre egy első példányt a GeometryPath osztályból.
- Hozz létre egy második példányt a GeometryPath osztályból.
- Alkalmazd a két útvonalat az alakzatra.
Ez a Java‑kód bemutatja, hogyan hozhatsz létre egy összetett egyedi alakzatot:
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();
}

Egyedi alakzat létrehozása görbe sarkokkal
Ez a Java‑kód megmutatja, hogyan hozhatsz létre egy egyedi alakzatot görbe (befelé ívelő) sarkokkal:
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();
}
Megállapítás, hogy egy alakzat geometriája zárt‑e
A zárt alakzat olyan, amelynek minden oldala összekapcsolódik, így egyetlen határoló nélkülös szegmens keletkezik. Ilyen alakzat lehet egy egyszerű geometriai forma vagy egy komplex egyedi körvonal. Az alábbi kódrészlet megmutatja, hogyan ellenőrizhető, hogy az alakzat geometriája zárt‑e:
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;
}
GeometryPath konvertálása java.awt.Shape‑ra
- Hozz létre egy példányt a GeometryShape osztályból.
- Hozz létre egy példányt a java.awt.Shape osztályból.
- A ShapeUtil segítségével konvertáld a java.awt.Shape példányt a GeometryPath példányra.
- Alkalmazd a kapott útvonalakat az alakzatra.
Ez a Java‑kód – a fenti lépések megvalósítása – demonstrálja a GeometryPath‑ról GraphicsPath‑ra történő konverzió folyamatát:
Presentation pres = new Presentation();
try {
// Új alakzat létrehozása
GeometryShape shape = (GeometryShape)pres.getSlides().get_Item(0).
getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 100);
// Az alakzat geometriai útvonalának lekérése
IGeometryPath originalPath = shape.getGeometryPaths()[0];
originalPath.setFillMode(PathFillModeType.None);
// Új grafikus útvonal létrehozása szöveggel
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();
}
// A grafikus útvonal konvertálása geometriai útvonalra
IGeometryPath textPath = ShapeUtil.graphicsPathToGeometryPath(graphicsPath);
textPath.setFillMode(PathFillModeType.Normal);
// Az új geometriai útvonal és az eredeti geometriai útvonal kombinációjának beállítása az alakzatra
shape.setGeometryPaths(new IGeometryPath[] { originalPath, textPath });
} finally {
if (pres != null) pres.dispose();
}

GYIK
Mi történik a kitöltéssel és körvonallal a geometria cseréje után?
A stílus az alakzaton marad; csak a kontúr változik. A kitöltés és a körvonal automatikusan az új geometriára kerül alkalmazásra.
Hogyan forgathatom helyesen a saját alakzatot a geometriájával együtt?
Használd az alakzat setRotation metódusát; a geometria az alakzattal együtt forog, mivel az az alakzat saját koordináta‑rendszeréhez van kötve.
Átalakíthatom-e a saját alakzatot egy képpé a „lezáráshoz”?
Igen. Exportáld a kívánt slide területet vagy magát a shape‑t raszteres formátumba; ez megkönnyíti a nehéz geometriákkal való további munkát.