Προσαρμογή Σχημάτων Παρουσίασης στο Android
Επισκόπηση
Αυτό το άρθρο εξηγεί πώς να προσαρμόσετε τα σχήματα παρουσίασης στο Aspose.Slides επεξεργάζοντας τη γεωμετρία του σχήματος μέσω σημείων επεξεργασίας και διαδρομών γεωμετρίας. Δείχνει πώς να εργαστείτε με GeometryPath και IGeometryPath για να τροποποιήσετε υπάρχοντα σχήματα, να εκτελέσετε βασικές λειτουργίες επεξεργασίας διαδρομής, να προσθέσετε ή να αφαιρέσετε σημεία και να εφαρμόσετε την ενημερωμένη γεωμετρία πίσω σε ένα σχήμα.
Επίσης, δείχνει πώς να δημιουργήσετε προσαρμοσμένα και σύνθετα σχήματα, να κατασκευάσετε σχήματα με καμπυλωτές γωνίες, να προσδιορίσετε εάν μια γεωμετρία σχήματος είναι κλειστή και να εξετάσετε τα στοιχεία του σχήματος χρησιμοποιώντας πίνακες σημείων Android.
Αλλαγή σχήματος χρησιμοποιώντας σημεία επεξεργασίας
Στο PowerPoint, μπορείτε να χρησιμοποιήσετε Edit Points για να τροποποιήσετε ένα τετράγωνο:
- Μετακινήστε μια γωνία προς τα μέσα ή προς τα έξω.
- Ρυθμίστε την καμπυλότητα σε ένα σημείο.
- Προσθέστε νέα σημεία.
Η επεξεργασία σημείων σάς επιτρέπει να τροποποιήσετε το περίγραμμα ενός σχήματος ή να χρησιμοποιήσετε ένα υπάρχον σχήμα ως βάση για ένα νέο.
Συμβουλές επεξεργασίας σχήματος

Όταν επεξεργάζεστε σχήματα PowerPoint, κρατήστε αυτές τις έννοιες στο μυαλό:
- Ένα σχήμα (ή η διαδρομή του) μπορεί να είναι κλειστό ή ανοιχτό.
- Η διαδρομή ενός σχήματος αποτελείται από σημεία αγκύρωσης συνδεδεμένα με τμήματα.
- Ένα τμήμα μπορεί να είναι ευθύ ή καμπυλωτό. Τα σημεία αγκύρωσης και τα χειριστήρια ελέγχου καθορίζουν το σχήμα του.
- Τα σημεία αγκύρωσης υπάρχουν ως σημεία γωνίας, ευθείες σημεία ή ομαλά σημεία:
- Σε σημείο γωνίας, τα γειτονικά τμήματα μπορούν να συναντηθούν με γωνία.
- Σε ομαλό σημείο, τα δύο χειριστήρια ελέγχου είναι ευθυγραμμισμένα και ισαποστά από το σημείο αγκύρωσης.
- Σε ευθύ σημείο, τα δύο χειριστήρια ελέγχου είναι ευθυγραμμισμένα αλλά μπορούν να είναι σε διαφορετικές αποστάσεις από το σημείο αγκύρωσης.
- Η μετακίνηση των σημείων αγκύρωσης ή η ρύθμιση των χειριστηρίων τους αλλάζει το περίγραμμα του σχήματος.
Για να επεξεργαστείτε σχήματα PowerPoint μέσω σημείων επεξεργασίας, το Aspose.Slides παρέχει την κλάση GeometryPath και το interface IGeometryPath.
- Ένα αντικείμενο GeometryPath αντιπροσωπεύει μια διαδρομή γεωμετρίας του αντικειμένου IGeometryShape.
- Για να ανακτήσετε το GeometryPath από το αντικείμενο IGeometryShape μπορείτε να χρησιμοποιήσετε τη μέθοδο IGeometryShape.getGeometryPaths.
- Για να ορίσετε το GeometryPath για ένα σχήμα, μπορείτε να χρησιμοποιήσετε τις μεθόδους: IGeometryShape.setGeometryPath για σχήματα με μία μόνο διαδρομή και IGeometryShape.setGeometryPaths για σχήματα με πολλαπλές διαδρομές.
- Για να προσθέσετε τμήματα, μπορείτε να χρησιμοποιήσετε τις μεθόδους του IGeometryPath.
- Χρησιμοποιώντας τις μεθόδους IGeometryPath.setStroke και IGeometryPath.setFillMode μπορείτε να ορίσετε την εμφάνιση μιας διαδρομής γεωμετρίας.
- Χρησιμοποιώντας τη μέθοδο IGeometryPath.getPathData μπορείτε να ανακτήσετε τη διαδρομή γεωμετρίας ενός GeometryShape ως έναν πίνακα τμημάτων διαδρομής.
Απλές λειτουργίες επεξεργασίας
Χρησιμοποιήστε τις παρακάτω μεθόδους για να επεξεργαστείτε μια διαδρομή γεωμετρίας. Οι υπερφορτώσεις που δέχονται δείκτη εισάγουν ένα τμήμα στη μηδενική θέση που αντιστοιχεί στον πίνακα τμημάτων της διαδρομής.
| Λειτουργία | Μέθοδος |
|---|---|
| Προσθήκη ή εισαγωγή ευθείας γραμμής. | GeometryPath.lineTo |
| Προσθήκη ή εισαγωγή κυρτής Bézier καμπύλης με δύο σημεία ελέγχου και ένα τελικό σημείο. | GeometryPath.cubicBezierTo |
| Προσθήκη ή εισαγωγή τετραγωνικής Bézier καμπύλης με ένα σημείο ελέγχου και ένα τελικό σημείο. | GeometryPath.quadraticBezierTo |
| Προσθήκη ελλειπτικού τόξου με τις καθορισμένες διαστάσεις και γωνίες σε μοίρες. | GeometryPath.arcTo |
| Κλείσιμο του τρέχοντος σχήματος συνδέοντας το τελικό του σημείο με το αρχικό. | GeometryPath.closeFigure |
| Ορισμός του αρχικού σημείου ενός σχήματος. | GeometryPath.moveTo |
| Αφαίρεση τμήματος σε δείκτη μηδενικής βάσης. | GeometryPath.removeAt |
Προσθήκη προσαρμοσμένων σημείων σε σχήμα
Αυτό το παράδειγμα εισάγει δύο σημεία σε ένα ορθογώνιο σχήμα χρησιμοποιώντας το GeometryPath.lineTo και εφαρμόζει τη επεξεργασμένη διαδρομή με το IGeometryShape.setGeometryPath. Οι συντεταγμένες είναι τοπικές στο σχήμα: και τα δύο νέα σημεία βρίσκονται στο κέντρο του, 100 μονάδες από τα αριστερά και 50 μονάδες από τα πάνω. Οι δείκτες τμημάτων 1 και 4 τα τοποθετούν στις άνω και κάτω άκρες, τραβώντας αυτές τις άκρες προς τα μέσα.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.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 {
presentation.dispose();
}

Αφαίρεση σημείων από σχήμα
Αυτό το παράδειγμα τροποποιεί το περίγραμμα μιας καρδιάς αφαιρώντας το τμήμα στη μηδενική θέση δείκτη 2 με το GeometryPath.removeAt. Η εφαρμογή της τροποποιημένης διαδρομής με το IGeometryShape.setGeometryPath ενημερώνει το περίγραμμα του σχήματος.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Heart, 100, 100, 300, 300);
IGeometryPath path = shape.getGeometryPaths()[0];
path.removeAt(2);
shape.setGeometryPath(path);
} finally {
presentation.dispose();
}

Δημιουργία προσαρμοσμένου σχήματος
Αυτό το παράδειγμα δημιουργεί ένα πεντάκοπο αστέρι με το GeometryPath. Εναλλασσόμενες εξωτερικές και εσωτερικές ακτίνες 100 και 50 μονάδες ορίζουν τις άκρες και τις εσοχές· ένα βήμα 72 μοιρών χωρίζει τις πέντε άκρες ομοιόμορφα. Η διαδρομή κλείνεται με το GeometryPath.closeFigure και εφαρμόζεται σε ένα ορθογώνιο σχήμα χρησιμοποιώντας το IGeometryShape.setGeometryPath, αντικαθιστώντας το περίγραμμά του.
import com.aspose.slides.*;
import android.graphics.PointF;
import java.util.ArrayList;
import java.util.List;
List<PointF> points = new ArrayList<>();
float outerRadius = 100f;
float innerRadius = 50f;
int angleStep = 72;
for (int angle = -90; angle < 270; angle += angleStep)
{
double radians = angle * (Math.PI / 180f);
double x = outerRadius * Math.cos(radians);
double y = outerRadius * Math.sin(radians);
PointF point = new PointF((float)x + outerRadius, (float)y + outerRadius);
points.add(point);
radians = Math.PI * (angle + angleStep / 2) / 180.0;
x = innerRadius * Math.cos(radians);
y = innerRadius * Math.sin(radians);
point = new PointF((float)x + outerRadius, (float)y + outerRadius);
points.add(point);
}
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 presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, outerRadius * 2, outerRadius * 2);
shape.setGeometryPath(starPath);
} finally {
presentation.dispose();
}

Δημιουργία σύνθετου προσαρμοσμένου σχήματος
Αυτό το παράδειγμα ορίζει δύο κλειστές αντικειμένα GeometryPath για το άνω και το κάτω τρίτο ενός σχήματος. Η εφαρμογή και των δύο διαδρομών με το IGeometryShape.setGeometryPaths δημιουργεί ένα ενιαίο σύνθετο σχήμα με ένα κενό στο μεσαίο τρίτο του.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 200, 100);
GeometryPath topPath = new GeometryPath();
topPath.moveTo(0, 0);
topPath.lineTo(shape.getWidth(), 0);
topPath.lineTo(shape.getWidth(), shape.getHeight() / 3);
topPath.lineTo(0, shape.getHeight() / 3);
topPath.closeFigure();
GeometryPath bottomPath = new GeometryPath();
bottomPath.moveTo(0, shape.getHeight() / 3 * 2);
bottomPath.lineTo(shape.getWidth(), shape.getHeight() / 3 * 2);
bottomPath.lineTo(shape.getWidth(), shape.getHeight());
bottomPath.lineTo(0, shape.getHeight());
bottomPath.closeFigure();
shape.setGeometryPaths(new GeometryPath[] { topPath, bottomPath });
} finally {
presentation.dispose();
}

Δημιουργία προσαρμοσμένου σχήματος με καμπυλωτές γωνίες
Αυτό το παράδειγμα συνδυάζει ευθείες διαδρομές με το GeometryPath.arcTo για να δημιουργήσει ένα σχήμα με εσωτερικά καμπυλωτές γωνίες. Κάθε μέγεθος γωνίας ορίζει το πλάτος και το ύψος του τόξου σε μονάδες, και η περιστροφή -90 μοιρών σχεδιάζει ένα αντεντάσξει τέταρτο έλλειψη. Η ολοκληρωμένη διαδρομή εφαρμόζεται με το IGeometryShape.setGeometryPath, και η παρουσίαση αποθηκεύεται σε μορφή PPTX.
import com.aspose.slides.*;
import android.graphics.PointF;
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 presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Custom, shapeX, shapeY, shapeWidth, shapeHeight);
PointF topLeft = new PointF(leftTopSize, 0);
PointF topRight = new PointF(shapeWidth - rightTopSize, 0);
PointF rightBottom = new PointF(shapeWidth, shapeHeight - rightBottomSize);
PointF bottomLeft = new PointF(leftBottomSize, shapeHeight);
PointF leftTop = new PointF(0, leftTopSize);
GeometryPath geometryPath = new GeometryPath();
geometryPath.moveTo(topLeft);
geometryPath.lineTo(topRight);
geometryPath.arcTo(rightTopSize, rightTopSize, 180, -90);
geometryPath.lineTo(rightBottom);
geometryPath.arcTo(rightBottomSize, rightBottomSize, -90, -90);
geometryPath.lineTo(bottomLeft);
geometryPath.arcTo(leftBottomSize, leftBottomSize, 0, -90);
geometryPath.lineTo(leftTop);
geometryPath.arcTo(leftTopSize, leftTopSize, 90, -90);
geometryPath.closeFigure();
shape.setGeometryPath(geometryPath);
presentation.save("output.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Εύρεση εάν η γεωμετρία σχήματος είναι κλειστή
Ο παρακάτω βοηθός ελέγχει εάν κάθε μη κενή διαδρομή γεωμετρίας τελειώνει με τμήμα κλεισίματος. Διαβάζει το IGeometryPath.getPathData και συγκρίνει την τελική εντολή του τμήματος με το IPathSegment.getPathCommand και το PathCommandType.Close. Επιστρέφει false όταν δεν υπάρχουν μη κενές διαδρομές. Αυτό ελέγχει την τελική εντολή κάθε διαδρομής· δεν εξετάζει κάθε υποσχήμα μέσα σε μια διαδρομή. Το παράδειγμα εκτυπώνει true για ένα ορθογώνιο.
import com.aspose.slides.*;
class GeometryInspector {
boolean isGeometryClosed(IGeometryShape geometryShape) {
boolean hasNonemptyPath = false;
for (IGeometryPath geometryPath : geometryShape.getGeometryPaths()) {
IPathSegment[] segments = geometryPath.getPathData();
if (segments.length == 0) {
continue;
}
hasNonemptyPath = true;
IPathSegment lastSegment = segments[segments.length - 1];
if (lastSegment.getPathCommand() != PathCommandType.Close) {
return false;
}
}
return hasNonemptyPath;
}
}
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 200, 100);
GeometryInspector inspector = new GeometryInspector();
boolean closed = inspector.isGeometryClosed(shape);
System.out.println(closed);
} finally {
presentation.dispose();
}
Εξαγωγή και εξέταση στοιχείων σχήματος
Χρησιμοποιήστε το IGeometryShape.createShapeElements για να εξετάσετε ένα υπάρχον σχήμα ως στοιχεία που περιέχουν σημεία διαδρομής και τύπους σημείων. Μετατρέψτε κάθε επιστραφέν IShapeElement σε ShapeElement για να ανακτήσετε τους πίνακες σημείων και τύπων μέσω των μεθόδων getPathPoints και getPathTypes. Αυτή η αναπαράσταση είναι χρήσιμη για ανάλυση περιγράμματος ή για μεταφορά γεωμετρίας σε προσαρμοσμένα εργαλεία σχεδίασης.
Το παράδειγμα ανοίγει το input.pptx, βρίσκει το πρώτο σχήμα γεωμετρίας απευθείας στην πρώτη διαφάνεια και εκτυπώνει τα τμήματα της διαδρομής του. Χρησιμοποιήστε μια παρουσίαση που περιέχει σχήμα με ευθείες και καμπύλες διαδρομές για να δείτε και τους δύο τύπους εξόδου. Δεν ψάχνει εντός ομάδων.
import com.aspose.slides.*;
import android.graphics.PointF;
Presentation presentation = new Presentation("input.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IGeometryShape shape = null;
for (IShape candidate : slide.getShapes()) {
if (candidate instanceof IGeometryShape) {
shape = (IGeometryShape) candidate;
break;
}
}
if (shape == null) {
System.out.println("No geometry shape found on the first slide.");
} else {
for (IShapeElement element : shape.createShapeElements()) {
ShapeElement shapeElement = (ShapeElement) element;
PointF[] points = shapeElement.getPathPoints();
byte[] types = shapeElement.getPathTypes();
System.out.println("Shape element:");
for (int i = 0; i < points.length; i++) {
int pointType = types[i] & 0x07; // Διατήρηση του τύπου τμήματος, εξαιρώντας τις σημαίες.
switch (pointType) {
case 0:
System.out.println("Start figure at " + points[i]);
break;
case 1:
System.out.println("Line to " + points[i]);
break;
case 3:
System.out.println("Cubic Bezier: controls " + points[i] + ", " + points[i + 1] + "; end " + points[i + 2]);
i += 2; // Κατανάλωση και των σημείων ελέγχου και του τελικού σημείου.
break;
}
if ((types[i] & 0x80) != 0) {
System.out.println("Close subpath back to its starting point.");
}
}
}
}
} finally {
presentation.dispose();
}
Οι πίνακες αντιστοιχούν κατά δείκτη: points[i] είναι σημείο και types[i] περιγράφει το ρόλο του. Ο τύπος 0 αρχίζει ένα σχήμα, και ο τύπος 1 σχεδιάζει μια γραμμή από το προηγούμενο σημείο στο τρέχον. Ένα τμήμα κυρτής Bézier ξεκινά από το προηγούμενο άκρο και χρησιμοποιεί τρεις διαδοχικές καταχωρήσεις τύπου 3: δύο σημεία ελέγχου ακολουθούμενα από το νέο άκρο. Η βρόγχος καταναλώνει αυτές τις τρεις καταχωρήσεις μαζί και ελέγχει το άκρο για κλείσιμο.
Οι τύποι σημείων περιέχουν επίσης σημαίες. Κάντε μάσκα με 0x07 για να προσδιορίσετε τον τύπο τμήματος, και ελέγξτε 0x80 χωριστά για να εντοπίσετε κλειστό υποδιάστημα. Για παράδειγμα, 129 (0x81) σημαίνει ένα άκρο γραμμής που κλείνει ένα υποδιάστημα, και 131 (0x83) σημαίνει ένα άκρο Bézier που κλείσει ένα. Η Java αποθηκεύει αυτές τις σημαίες σε υπογεγραμμένα byte· η μάσκα διατηρεί τις προθέσιμες τιμές bit. Η σύγκριση της ακατέργαστης τιμής μόνο με 1 ή 3 θα χάσει αυτές τις περιπτώσεις. Άλλες σημαίες, όπως η παύλα (0x10) και ο δείκτης (0x20), δεν αλλάζουν τον βασικό τύπο τμήματος.
Συντεταγμένες και μετασχηματισμοί. Τα σημεία μετρώνται σε μονάδες (1/72 ίντσα), με το X να αυξάνεται προς τα δεξιά και το Y να αυξάνεται προς τα κάτω. Για ένα μη ομαδοποιημένο σχήμα, οι εξαγόμενες συντεταγμένες περιλαμβάνουν ήδη τη θέση που επιστρέφεται από τα getX και getY και αντανακλούν το τρέχον πλάτος και ύψος του. Για παράδειγμα, ένα μη περιστραμμένο ορθογώνιο στο (100, 200) με μέγεθος 120 × 80 έχει όρια περιγράμματος (100, 200)–(220, 280). Μην προσθέσετε ξανά τη θέση του σχήματος. Αφαιρέστε το X και Y του για να λάβετε συντεταγμένες σχετικά με το μη περιστραμμένο πλαίσιο.
Οι εξαγόμενα σημεία δεν εφαρμόζουν την περιστροφή του σχήματος, που επιστρέφεται από το getRotation, ούτε τις οριζόντιες και κατακόρυφες αναστροφές. Για να αναπαράγετε το εμφανιζόμενο περίγραμμα, εφαρμόστε αυτούς τους μετασχηματισμούς γύρω από το κέντρο του σχήματος. Για ομαδοποιημένα σχήματα, λάβετε επίσης υπόψη τη χαρτογράφηση συντεταγμένων της ομάδας και τους μετασχηματισμούς· μην υποθέσετε ότι τα εξαγόμενα σημεία είναι οι τελικές συντεταγμένες της διαφάνειας ή εφαρμόστε διπλή μετάθεση ή κλιμάκωση εάν ήδη αντικατοπτρίζεται στο πλαίσιο του παιδιού.
Εξέταση έναντι επεξεργασίας. Οι εξαγόμενοι πίνακες περιγράφουν το περίγραμμα· η αλλαγή τους δεν ενημερώνει το αρχικό σχήμα. Επιλέξτε αυτή τη μέθοδο όταν η ανάλυση ή ο κώδικας σχεδίασής σας χρειάζεται πίνακες σημείων/τύπων. Χρησιμοποιήστε το getGeometryPaths όταν χρειάζεστε εντολές γεωμετρίας στο τοπικό σύστημα συντεταγμένων του σχήματος ή θέλετε να επεξεργαστείτε τη γεωμετρία του. Εφαρμόστε επεξεργασμένες διαδρομές μέσω του setGeometryPath ή του setGeometryPaths.
Συχνές Ερωτήσεις
Τι θα συμβεί στο γέμισμα και το περίγραμμα μετά την αντικατάσταση της γεωμετρίας;
Το στυλ παραμένει στο σχήμα· μόνο το περίγραμμα αλλάζει. Το γέμισμα και το περίγραμμα εφαρμόζονται αυτόματα στη νέα γεωμετρία.
Πώς να περιστρέψω σωστά ένα προσαρμοσμένο σχήμα μαζί με τη γεωμετρία του;
Χρησιμοποιήστε τη μέθοδο setRotation του σχήματος· η γεωμετρία περιστρέφεται με το σχήμα επειδή είναι δεσμευμένη στο δικό του σύστημα συντεταγμένων.
Μπορώ να μετατρέψω ένα προσαρμοσμένο σχήμα σε εικόνα για να “κλειδώσω” το αποτέλεσμα;
Ναι. Εξάγετε την απαιτούμενη περιοχή slide ή το shape σε μορφή raster· αυτό απλοποιεί την περαιτέρω εργασία με σύνθετες γεωμετρίες.