สร้างและแก้ไขพฤติกรรมการเคลื่อนไหวแบบกำหนดเองใน .NET
ภาพรวม
พฤติกรรมการเคลื่อนไหวแบบกำหนดเองช่วยให้คุณควบคุมการทำงานแต่ละอย่างภายในเอฟเฟ็กต์การเคลื่อนไหวได้ เช่น การเปลี่ยนสี การหมุนรูปทรง หรือการตามเส้นทางการเคลื่อนที่ที่แก้ไขได้ คู่มือเล่านี้แสดงวิธีการสร้างและรวมพฤติกรรม ตั้งค่าเวลา ตรวจสอบและแก้ไขการเคลื่อนไหวที่มีอยู่ และตรวจสอบว่าคุณสมบัติต่าง ๆ ยังคงอยู่หลังจากบันทึกและเปิดการนำเสนอใหม่
สำหรับเอฟเฟ็กต์ที่กำหนดไว้ล่วงหน้าและการทำงานเมื่อคลิก ดูที่ Shape Animation
ทำความเข้าใจโมเดลการเคลื่อนไหว
การเคลื่อนไหวถูกจัดเป็น Timeline → Sequence → Effect → Behaviors :
- Timeline ของสไลด์มีลำดับหลักและลำดับเชิงโต้ตอบ
- ISequence มีเอฟเฟ็กต์ต่าง ๆ ซึ่งอาจเป้าหมายที่รูปร่างหลากหลาย
- IEffect ระบุตำแหน่งของรูปร่าง เป้าหมาย ค่าตั้งต้น ชนิดย่อย และเวลาเอฟเฟ็กต์
- IEffect.Behaviors มีการทำงานที่ทำให้เอฟเฟ็กต์เกิดขึ้น: การเปลี่ยนสี การย้าย การหมุน การตั้งค่าคุณสมบัติ ฯลฯ
สร้างพฤติกรรมเดี่ยว
เรียก ISequence.AddEffect เพื่อสร้างเอฟเฟ็กต์และเข้าถึงคอลเลกชัน Behaviors ของมัน พรีเซ็ตสามารถเติมคอลเลกชันนี้โดยอัตโนมัติ ให้คงการทำงานไว้เมื่อต่อเติมพรีเซ็ต หรือใช้ Clear เมื่อต้องการแทนที่โดยเจตนา
IBehaviorFactory สร้าง 8 ชนิดของพฤติกรรมที่แสดงด้านล่าง การเคลื่อนไหวอธิบายไว้ในส่วน Build a Motion Path ตัวอย่างการสร้างแต่ละอย่างเป็นโปรแกรมเต็มรูปแบบ; ตัวอย่างการแก้ไขต่อมาจะระบุไฟล์ผลลัพธ์ที่ใช้
Rotation
ใช้ CreateRotationEffect เพื่อสร้างการหมุน By ระบุมุมสัมพัทธ์เป็นองศา; From และ To ระบุจุดเริ่มต้นและสิ้นสุด
ตัวอย่างเริ่มจากเอฟเฟ็กต์ Spin แทนที่การทำงานของพรีเซ็ตด้วยพฤติกรรมการหมุนหนึ่งรายการ และกำหนดระยะเวลาให้สองวินาที มุมสัมพัทธ์ 90 องศาเป็นการหมุนหนึ่งไตรมาสจากทิศทางเริ่มต้นของรูปร่าง ดังนั้นไม่จำเป็นต้องกำหนดมุมเริ่มต้นอย่างชัดเจน
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.Spin, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var rotation = factory.CreateRotationEffect();
rotation.By = 90f;
rotation.Timing.Duration = 2f;
effect.Behaviors.Add(rotation);
presentation.Save("rotation.pptx", SaveFormat.Pptx);
rotation.pptx มีรูปร่างหนึ่งและพฤติกรรมการหมุนหนึ่งตัว คอลเลกชัน เวลา และตัวอย่างการแก้ไขการหมุนด้านล่างใช้ไฟล์นี้
Scale
ใช้ CreateScaleEffect พร้อมเปอร์เซ็นต์ X/Y: From และ To บรรยายขนาดเริ่มต้นและสิ้นสุด ในขณะที่ By บรรยายการเปลี่ยนแปลงสัมพัทธ์ ที่นี่ 100 หมายถึงขนาดดั้งเดิม
ตัวอย่างขยายมิติทั้งสองจาก 100 % ไปเป็น 125 % ในสองวินาที การใช้เปอร์เซ็นต์แนวนอนและแนวตั้งเท่ากันจะรักษาสัดส่วนของรูป; ค่าเปอร์เซ็นต์ต่างกันจะทำให้มิติหนึ่งยืดออกมากกว่าอีกมิติ
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.GrowShrink, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var scale = factory.CreateScaleEffect();
scale.From = new PointF(100, 100);
scale.To = new PointF(125, 125);
scale.Timing.Duration = 2f;
effect.Behaviors.Add(scale);
presentation.Save("scale.pptx", SaveFormat.Pptx);
Color
ใช้ CreateColorEffect เพื่อเปลี่ยนสีเติมจากสีน้ำเงินเป็นสีส้ม From และ To เป็นสี; By เป็นการออฟเซ็ตสี IBehavior.Properties ระบุแอตทริบิวต์ที่กำลังเคลื่อนไหว
การเติมเต็มของรูปร่างจะเริ่มต้นด้วยสีน้ำเงิน ตรงกับสีเริ่มต้นของการเคลื่อนไหว การเลือกแอตทริบิวต์สีเติมทำให้พฤติกรรมรู้ว่าจะเปลี่ยนส่วนใดของรูปร่าง; จุดสีเริ่มและสิ้นสุดเพียงอย่างเดียวไม่ได้ระบุแอตทริบิวต์นั้น ผลเอฟเฟ็กต์บันทึกการเปลี่ยนสีเป็นสองวินาทีไปเป็นสีส้ม
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
shape.FillFormat.FillType = FillType.Solid;
shape.FillFormat.SolidFillColor.Color = Color.Blue;
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.ChangeFillColor, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var color = factory.CreateColorEffect();
color.Properties.Add(BehaviorProperty.FillColor);
color.From.Color = Color.Blue;
color.To.Color = Color.Orange;
color.Timing.Duration = 2f;
effect.Behaviors.Add(color);
presentation.Save("color.pptx", SaveFormat.Pptx);
Filter
ใช้ CreateFilterEffect เพื่อเลือกวิธีการลบ Type, Subtype, และ Reveal ระบุฟิลเตอร์ ทิศทาง และว่าจะเปิดหรือซ่อนรูปร่างหรือไม่
ตัวอย่างนี้ตั้งค่าให้ลบสองวินาทีโดยเปิดเผยรูปร่างโดยใช้ชนิดย่อยที่มาจากด้านขวา การตั้งค่าฟิลเตอร์อยู่ในพฤติกรรมภายในเอฟเฟ็กต์ ดังนั้นจึงตั้งค่าได้หลังจากลบการทำงานดั้งเดิมของพรีเซ็ตออกแล้ว
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.Wipe, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var filter = factory.CreateFilterEffect();
filter.Type = FilterEffectType.Wipe;
filter.Subtype = FilterEffectSubtype.Right;
filter.Reveal = FilterEffectRevealType.In;
filter.Timing.Duration = 2f;
effect.Behaviors.Add(filter);
presentation.Save("filter.pptx", SaveFormat.Pptx);
Property
ใช้ CreatePropertyEffect เพื่อเคลื่อนไหวความทึบแสง From, To, และ By เป็นสตริงที่ตีความโดยใช้ ValueType และ CalcMode เลือกใช้จุดสิ้นสุดหรือออฟเซ็ตสัมพัทธ์แทนการตั้งค่าทั้งสามพร้อมกัน
ที่นี่แอตทริบิวต์ที่เลือกคือ opacity และสตริงตัวเลขแสดงการเปลี่ยนจาก 25 % ไปเป็นความทึบแสงเต็ม การผสมเชิงเส้นอธิบายการเปลี่ยนแปลงอย่างค่อยเป็นค่อยไประหว่างค่าเหล่านั้น เมื่อนำตัวอย่างนี้ไปใช้กับแอตทริบิวต์อื่น ให้เลือกประเภทค่าและค่าจุดสิ้นสุดที่เหมาะสมกับแอตทริบิวต์นั้น
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.Fade, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var property = factory.CreatePropertyEffect();
property.Properties.Add(BehaviorProperty.StyleOpacity);
property.ValueType = PropertyValueType.Number;
property.CalcMode = PropertyCalcModeType.Linear;
property.From = "0.25";
property.To = "1";
property.Timing.Duration = 2f;
effect.Behaviors.Add(property);
presentation.Save("property.pptx", SaveFormat.Pptx);
Set
ใช้ CreateSetEffect เพื่อกำหนดการมองเห็นผ่าน To พฤติกรรม set ไม่ได้ทำการผสมค่าระหว่างจุดสิ้นสุด
ตัวอย่างเลือกแอตทริบิวต์ visibility แล้วกำหนดสตริง visible เมื่อพฤติกรรมทำงาน รูปสี่เหลี่ยมมองเห็นได้แล้วในงานนำเสนอขนาดเล็กนี้ ดังนั้นการกำหนดอาจไม่ทำให้เห็นการเปลี่ยนแปลงที่ชัดเจนโดยตัวมันเอง การทำแบบนี้มีประโยชน์เมื่อเป็นส่วนหนึ่งของเอฟเฟ็กต์ที่ใหญ่กว่าที่ควบคุมการซ่อนหรือแสดงรูปร่างด้วย
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.Appear, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var set = factory.CreateSetEffect();
set.Properties.Add(BehaviorProperty.StyleVisibility);
set.To = "visible";
effect.Behaviors.Add(set);
presentation.Save("set.pptx", SaveFormat.Pptx);
Command
ใช้ CreateCommandEffect และกำหนดค่า Type, CommandString, และ ShapeTarget ใส่ไฟล์บันทึกเสียง WAV ชื่อ sample.wav ไว้ในไดเรกทอรีทำงาน ตัวอย่างนี้ฝังไฟล์ด้วย AddAudioFrameEmbedded แล้วแนบคำสั่งเล่นไปยัง audio frame
audio frame เป็นทั้งเป้าหมายของเอฟเฟ็กต์และของคำสั่ง การเชื่อมคำสั่ง play กับการบันทึกที่ฝังไว้ทำให้เกิดการเล่น; คำสั่งสตริงเพียงอย่างเดียวไม่บ่งบอกว่าจะควบคุมวัตถุสื่ออะไร เอฟเฟ็กต์ตั้งค่าให้เริ่มเมื่อคลิกในระหว่างการสไลด์โชว์
using System.IO;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
using var audioStream = File.OpenRead("sample.wav");
var audioFrame = slide.Shapes.AddAudioFrameEmbedded(100, 100, 40, 40, audioStream);
var effect = slide.Timeline.MainSequence.AddEffect(audioFrame, EffectType.MediaPlay, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var command = factory.CreateCommandEffect();
command.Type = CommandEffectType.Call;
command.CommandString = "play";
command.ShapeTarget = audioFrame;
effect.Behaviors.Add(command);
presentation.Save("command.pptx", SaveFormat.Pptx);
การบันทึกจะเก็บคำสั่งไว้ใน command.pptx; มันจะไม่เล่นไฟล์เสียง การเล่นต้องใช้โปรแกรมสไลด์โชว์ที่สนับสนุนคำสั่งและสื่อเป้าหมายนั้น
จัดการคอลเลกชันพฤติกรรม
IBehaviorCollection รองรับ Add, Insert, Remove, และ RemoveAt ตัวอย่างนี้เปิด rotation.pptx เพิ่มการสเกล ย้ายมันก่อนการหมุน และลบการหมุน การลบและแทรกใหม่ของอ็อบเจ็กต์เดียวกันทำให้ตำแหน่งที่จัดเก็บเปลี่ยนโดยไม่ทำสำเนา
ลำดับการแก้ไขทำให้คอลเลกชันเปลี่ยนจาก rotation–scale ไปเป็น scale–rotation จากนั้นเป็น scale เพียงอย่างเดียว ดัชนีอ้างอิงคอลเลกชันปัจจุบัน ดังนั้นการลบใช้ดัชนีใหม่ของการหมุนหลังการจัดลำดับใหม่ การวนลูปสุดท้ายยืนยันว่าพฤติกรรมใดจะถูกบันทึก
using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("rotation.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var behaviors = effect.Behaviors;
IBehaviorFactory factory = new BehaviorFactory();
var scale = factory.CreateScaleEffect();
scale.To = new PointF(125, 125);
scale.Timing.Duration = 2f;
behaviors.Add(scale);
behaviors.Remove(scale);
behaviors.Insert(0, scale);
behaviors.RemoveAt(1);
foreach (var behavior in behaviors)
Console.WriteLine(behavior.GetType().Name);
presentation.Save("collection-edited.pptx", SaveFormat.Pptx);
ผลลัพธ์คือ ScaleEffect: เหลือเพียงการสเกลเท่านั้น คำสั่งของคอลเลกชันเองไม่ได้กำหนดให้พฤติกรรมทำงานต่อเนื่องกัน ควรใช้ Clear เฉพาะเมื่อแทนที่การทำงานทั้งหมด
กำหนดเวลาพฤติกรรม
IBehavior.Timing เปิดเผย ITiming แยกจาก IEffect.Timing เวลาเอฟเฟ็กต์กำหนดการทำงานของเอฟเฟ็กต์โดยรวม; เวลาพฤติกรรมอธิบายการทำงานภายในเอฟเฟ็กต์นั้น
ตั้งค่า Duration, Delay, Repetition, และ Acceleration
เปิด rotation.pptx และตั้งค่า Duration และ TriggerDelayTime เป็นวินาที จากนั้นกำหนดค่า RepeatCount Accelerate และ Decelerate เป็นส่วนของระยะเวลา; ให้ผลรวมสูงสุดไม่เกิน 1
ไฟล์อินพุตคือไฟล์ที่สร้างในตัวอย่างการหมุน ซึ่งพฤติกรรมแรกเป็นการหมุน ตัวอย่างนี้เปลี่ยนเวลาเพียงพฤติกรรมนั้น; มุม 90 ° ยังคงเหมือนเดิม การแยกมุมและเวลาออกจากกันทำให้ปรับความเร็วได้ง่ายขึ้นโดยไม่ต้องสร้างเอฟเฟ็กต์ใหม่
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("rotation.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var rotation = (IRotationEffect)effect.Behaviors[0];
rotation.Timing.Duration = 2f;
rotation.Timing.TriggerDelayTime = 0.5f;
rotation.Timing.RepeatCount = 3f;
rotation.Timing.Accelerate = 0.2f;
rotation.Timing.Decelerate = 0.2f;
presentation.Save("timing.pptx", SaveFormat.Pptx);
พฤติกรรมนี้ใช้ระยะเวลา 2 วินาที, หน่วงครึ่งวินาที, และทำซ้ำ 3 ครั้ง 20 % แรกและสุดท้ายของระยะเวลาจะใช้สำหรับการเร่งความเร็วและการชะลอ
นโยบายการทำซ้ำอื่น ๆ รวมถึง RepeatDuration, RepeatUntilEndSlide, และ RepeatUntilNextClick ให้เลือกใช้หนึ่งนโยบายแทนการเปิดทั้งหมดพร้อมกัน AutoReverse จะเล่นเอฟเฟ็กต์ย้อนกลับหลังจากเล่นไปข้างหน้า การเร่งและการชะลอใช้กับการเปลี่ยนแปลงต่อเนื่อง ไม่ใช่การกำหนดค่าแบบก้าวกระโดดหรือคำสั่ง
สร้าง Motion Path
ใช้ CreateMotionEffect เพื่อสร้างการเคลื่อนที่ From, To, และ By บรรยายพิกัดหรือออฟเซ็ตเป็นเปอร์เซ็นต์ สำหรับเส้นทางที่แก้ไขได้ ให้สร้าง MotionPath แล้วกำหนดให้กับ IMotionEffect.Path IMotionPath จะเก็บคำสั่งเส้นทาง
MotionCommandPathType เลือกการทำงาน:
| คำสั่ง | จุด | ความหมาย |
|---|---|---|
| MoveTo | หนึ่ง | กำหนดตำแหน่งเริ่มต้น |
| LineTo | หนึ่ง | เคลื่อนที่ไปตามส่วนตรงจนถึงจุดสิ้นสุด |
| CurveTo | สาม | ตามโค้งพาราโบลาโดยใช้จุดควบคุมสองจุดและจุดสิ้นสุด |
| CloseLoop | ไม่มี | กลับไปยังตำแหน่งเริ่มต้น |
| End | ไม่มี | สิ้นสุดเส้นทาง |
MotionPathPointsType บรรยายลักษณะการแก้ไขจุด เช่น จุดมุมหรือจุดเรียบ ไม่ได้แทนที่ชนิดคำสั่ง ใช้ชนิดจุดโค้งสำหรับตัวอย่างโค้งด้านล่าง และชนิดจุดมุมสำหรับส่วนตรง
พิกัดเส้นทางเป็นค่าปกติเทียบกับขนาดสไลด์: การเคลื่อนที่ X ที่ 0.25 หมายถึงหนึ่งส่วนสี่ของความกว้างสไลด์ ไม่ใช่ 0.25 จุด; ค่า Y บวกไปด้านล่าง คำสั่ง Absolute ระบุตำแหน่งในระบบพิกัดของเส้นทาง; คำสั่ง Relative ระบุออฟเซ็ตจากตำแหน่งปัจจุบัน สิ่งนี้แยกจาก Origin ที่เลือกกรอบอ้างอิงของเส้นทาง, และ PathEditMode ที่ควบคุมการเคลื่อนที่ของเส้นทางเมื่อย้ายรูปร่าง
สร้าง Straight Path
สร้างพฤติกรรมการเคลื่อนที่ด้วยจุดเริ่มต้น ส่วนตรงหนึ่งส่วน และคำสั่งจบ IMotionPath.Add รับชนิดคำสั่ง, จุดของมัน, ชนิดจุด, และแฟล็กพิกัดสัมพัทธ์
คำสั่งเริ่มต้นกำหนด (0, 0) และเส้นตรงสิ้นสุดที่ (0.25, 0) ทำให้เส้นทางเคลื่อนที่แนวนอนหนึ่งส่วนสี่ของความกว้างสไลด์ คำสั่งสิ้นสุดไม่มีจุดพิกัด เมื่อกำหนดเส้นทางแล้ว การเพิ่มพฤติกรรมการเคลื่อนที่เข้าไปในเอฟเฟ็กต์จะเชื่อมเส้นทางนั้นกับสี่เหลี่ยม
using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.PathRight, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var motion = factory.CreateMotionEffect();
motion.Origin = MotionOriginType.Layout;
motion.Timing.Duration = 2f;
var path = new MotionPath();
path.Add(MotionCommandPathType.MoveTo, new[] { new PointF(0, 0) }, MotionPathPointsType.Auto, false);
path.Add(MotionCommandPathType.LineTo, new[] { new PointF(0.25f, 0) }, MotionPathPointsType.Corner, false);
path.Add(MotionCommandPathType.End, Array.Empty<PointF>(), MotionPathPointsType.None, false);
motion.Path = path;
effect.Behaviors.Add(motion);
presentation.Save("motion.pptx", SaveFormat.Pptx);
motion.pptx มีพฤติกรรมการเคลื่อนที่หนึ่งตัวพร้อมคำสั่งเส้นทางสามคำสั่ง ตัวอย่างการแก้ไขไฟล์ต่อไปนี้อ้างอิงโครงสร้างนี้
เปรียบเทียบ Absolute และ Relative Coordinates
สองอ็อบเจ็กต์เส้นทางนี้บรรยายเส้นทางเดียวกัน คำสั่ง Absolute สิ้นสุดที่ (0.3, 0.1); คำสั่ง Relative เพิ่ม (0.1, 0.1) ไปยังตำแหน่งปัจจุบัน (0.2, 0)
ทั้งสองเส้นทางเริ่มจากตำแหน่งเดียวกัน สำหรับเส้นตรงแบบ Relative ให้นำออฟเซ็ต X และ Y ไปบวกกับตำแหน่งปัจจุบันเพื่อหาจุดสิ้นสุด; สำหรับ Absolute ให้อ่านจุดสิ้นสุดโดยตรง การสลับแฟล็กโดยไม่แปลงค่าพิกัดจะทำให้เส้นทางต่างกัน
using System.Drawing;
using Aspose.Slides.Animation;
var absolutePath = new MotionPath();
absolutePath.Add(MotionCommandPathType.MoveTo, new[] { new PointF(0.2f, 0) }, MotionPathPointsType.Auto, false);
absolutePath.Add(MotionCommandPathType.LineTo, new[] { new PointF(0.3f, 0.1f) }, MotionPathPointsType.Corner, false);
var relativePath = new MotionPath();
relativePath.Add(MotionCommandPathType.MoveTo, new[] { new PointF(0.2f, 0) }, MotionPathPointsType.Auto, false);
relativePath.Add(MotionCommandPathType.LineTo, new[] { new PointF(0.1f, 0.1f) }, MotionPathPointsType.Corner, true);
กำหนดเส้นทางใดเส้นทางหนึ่งให้กับพฤติกรรมการเคลื่อนที่เพื่อใช้ในงานนำเสนอ ตัวแปรบูลีนสุดท้ายเลือกพิกัดสัมพัทธ์สำหรับคําสั่งนั้น
แทนที่ Line ด้วย Curve
เปิด motion.pptx และแทนที่คำสั่งเส้นตรงด้วยโค้งลูกบาศก์ ให้ใส่จุดควบคุมสองจุดก่อน แล้วตามด้วยจุดสิ้นสุด
ตำแหน่งเริ่มต้นมาจากคำสั่งก่อนหน้า จุดสองแรกกำหนดรูปร่างโค้ง ส่วนจุดที่สามเป็นจุดหมาย; ไม่ใช่สามจุดต่อเนื่องเป็นจุดหมาย การอัปเดตชนิดคำสั่ง, ชนิดจุดแก้ไข, และอาร์เรย์จุดพร้อมกันทำให้ส่วนโค้งสอดคล้องกับเรขาคณิตใหม่
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("motion.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var motion = (IMotionEffect)effect.Behaviors[0];
var path = motion.Path;
path[1].CommandType = MotionCommandPathType.CurveTo;
path[1].PointsType = MotionPathPointsType.CurveSmooth;
path[1].Points = new[] { new PointF(0.1f, 0), new PointF(0.2f, 0.1f), new PointF(0.3f, 0.1f) };
presentation.Save("curve.pptx", SaveFormat.Pptx);
เส้นทางใน curve.pptx ยังมีคำสั่งสามคำสั่ง; คำสั่งกลางตอนนี้เป็นโค้ง
ตรวจสอบและแก้ไขเส้นทางที่บันทึกไว้
แต่ละ IMotionCmdPath เปิดเผย Points, CommandType, PointsType, และ IsRelative ตัวอย่างต่อไปใช้เส้นทางสามคำสั่งที่ทราบใน motion.pptx สำหรับอินพุตใด ๆ ให้ค้นหาเอฟเฟ็กต์ที่ตั้งใจและตรวจสอบชนิดคำสั่งและจำนวนจุดก่อนแก้ไขโดยตำแหน่ง
อ่านคำสั่งและพิกัด
อ่านเส้นทางโดยไม่เปลี่ยนแปลง คำสั่ง End และ CloseLoop ไม่ต้องการจุด ดังนั้นให้เตรียมรับอาร์เรย์จุดเป็น null
ผลลัพธ์จับคู่แต่ละคำสั่งกับแฟล็กพิกัดสัมพัทธ์ก่อนแสดงจุดของมัน ทำให้คุณแยกจุดสิ้นสุดจากออฟเซ็ตก่อนแก้ไขเส้นทาง โค้งจะแสดงสามจุด ส่วนเส้นตรงในไฟล์นี้จะแสดงเพียงหนึ่งจุด
using System;
using Aspose.Slides;
using Aspose.Slides.Animation;
using var presentation = new Presentation("motion.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var motion = (IMotionEffect)effect.Behaviors[0];
var path = motion.Path;
foreach (var segment in path)
{
Console.WriteLine($"{segment.CommandType}, relative: {segment.IsRelative}");
if (segment.Points != null)
foreach (var point in segment.Points)
Console.WriteLine($"X={point.X}, Y={point.Y}");
}
การแสดงรายการมีจุดเริ่มต้น, เส้นตรง Absolute สิ้นสุดที่ (0.25, 0), และคำสั่ง End
เปลี่ยน Endpoint
เปิด motion.pptx และแทนที่อาร์เรย์จุดของเส้นตรงเพื่อย้ายจุดสิ้นสุด
ในไฟล์อินพุต ดัชนี 0 คือคำสั่งเริ่มต้น ดัชนี 1 คือเส้นตรง การแทนที่จุดเดียวของเส้นตรงจะเปลี่ยนปลายทางโดยไม่เปลี่ยนชนิดคำสั่ง เวลา หรือตำแหน่งในคอลเลกชัน เนื่องจากคำสั่งใช้พิกัด Absolute คู่ใหม่จึงระบุตำแหน่งแทนการเพิ่มออฟเซ็ต
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("motion.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var motion = (IMotionEffect)effect.Behaviors[0];
motion.Path[1].Points = new[] { new PointF(0.4f, 0.1f) };
presentation.Save("motion-endpoint.pptx", SaveFormat.Pptx);
เส้นตรงใน motion-endpoint.pptx สิ้นสุดที่ (0.4, 0.1); ไฟล์ต้นฉบับไม่ได้รับการเปลี่ยนแปลง
แทนที่ Segment
ใช้ Insert และ RemoveAt เพื่อแทนที่เส้นตรงใน motion.pptx การแทรกทำให้เส้นตรงเดิมย้ายไปเป็นดัชนี 2
ตัวอย่างนี้แสดงการแทนที่อ็อบเจ็กต์คำสั่งแทนการแก้ไขพิกัดเดิม หลังการแทรก คอลเลกชันชั่วคราวจะมีคำสั่งเริ่มต้น, เส้นใหม่, เส้นเก่า, และคำสั่ง End การลบดัชนี 2 จะทิ้งเส้นเก่าและเหลือเส้นใหม่ในที่ตำแหน่ง
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("motion.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var motion = (IMotionEffect)effect.Behaviors[0];
var path = motion.Path;
path.Insert(1, MotionCommandPathType.LineTo, new[] { new PointF(0.2f, 0.1f) }, MotionPathPointsType.Corner, false);
path.RemoveAt(2);
presentation.Save("motion-edited.pptx", SaveFormat.Pptx);
เส้นทางที่บันทึกยังคงมีสามคำสั่ง โดยเส้นใหม่สิ้นสุดที่ (0.2, 0.1) และคำสั่ง End อยู่ท้ายสุด
แก้ไขและตรวจสอบพฤติกรรมที่มีอยู่
เมื่อไม่ทราบดัชนีของพฤติกรรม ให้เลือกโดยชนิด ตัวอย่างนี้เปิด rotation.pptx ค้นหา IRotationEffect เปลี่ยนมุมและตรวจสอบค่าที่บันทึกหลังจากเปิดใหม่
การตรวจสอบชนิดทำให้ลูปข้ามพฤติกรรมที่ไม่ใช่การหมุน การโหลดครั้งที่สองอ่านไฟล์ที่บันทึกลงในอ็อบเจ็กต์การนำเสนอแยกต่างหาก ดังนั้นการเปรียบเทียบตรวจสอบข้อมูลที่คงอยู่ ไม่ใช่ค่าที่ยังคงอยู่ในหน่วยความจำ ตัวอย่างยังคงสมมติว่าเอฟเฟ็กต์ที่รู้จักอยู่เป็นรายการแรกในลำดับหลัก; การเลือกพฤติกรรมโดยชนิดไม่ได้ทำให้ค้นหาเอฟเฟ็กต์ที่ถูกต้องในงานนำเสนอใด ๆ
using System;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("rotation.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
foreach (var behavior in effect.Behaviors)
{
if (behavior is IRotationEffect rotation)
rotation.By = 180f;
}
presentation.Save("rotation-edited.pptx", SaveFormat.Pptx);
using var reopened = new Presentation("rotation-edited.pptx");
var savedEffect = reopened.Slides[0].Timeline.MainSequence[0];
foreach (var behavior in savedEffect.Behaviors)
{
if (behavior is IRotationEffect rotation)
Console.WriteLine($"Rotation preserved: {Math.Abs(rotation.By - 180f) < 0.001f}");
}
ผลลัพธ์คือ Rotation preserved: True ใช้รูปแบบการตรวจสอบชนิดเดียวกันกับพฤติกรรมอื่น ๆ สำหรับการตรวจสอบการคงที่อย่างสมบูรณ์ ให้เปรียบเทียบรูปร่างเป้าหมาย, เอฟเฟ็กต์, ชนิดและลำดับพฤติกรรม, เวลา, และคำสั่งเส้นทาง ใช้ความทนทานเชิงตัวเลขสำหรับค่าทศนิยม สำหรับงานนำเสนอที่มีโครงสร้างการเคลื่อนไหวไม่ทราบ ให้ดูที่ Read Shape Animations เพื่อท่องลำดับหลักและลำดับเชิงโต้ตอบ
ลำดับพฤติกรรม, พรีเซ็ต, และการเล่น
ลำดับใน IBehaviorCollection คือลำดับที่จัดเก็บของการทำงานในเอฟเฟ็กต์ ไม่ได้เป็นเพลย์ลิสต์ที่พฤติกรรมทุกรายการรอคอยรายการก่อนหน้า เวลาและเอฟเฟ็กต์ที่ห่อหุ้มกำหนดการจัดตาราง พฤติกรรมสามารถทับซ้อนกันได้ และการทำงานบนคุณสมบัติเช่นเดียวกันอาจโต้ตอบผ่าน Additive และ Accumulate อย่าใช้การจัดลำดับคอลเลกชันเพียงอย่างเดียวเพื่อกำหนด “ย้าย แล้วหมุน”; ให้ใช้เวลาแบบชัดเจนหรือเอฟเฟ็กต์แยกตามที่อธิบายใน Shape Animation
Type และ Subtype ของเอฟเฟ็กต์บรรยายพรีเซ็ต ไม่ได้เป็นคำอธิบายครบถ้วนของต้นไม้พฤติกรรมที่แก้ไขแล้ว เลือกพรีเซ็ตและซับไทป์ก่อนปรับแต่งพฤติกรรม: การเปลี่ยนพรีเซ็ตอาจสร้างคอลเลกชันใหม่และทำให้การทำงานที่กำหนดเองหายไป ตัวอย่างเช่น การเปลี่ยนเอฟเฟ็กต์ Spin ที่กำหนดเองเป็น Fade อาจแทนที่พฤติกรรมการหมุนด้วยพฤติกรรม set และ filter ตรวจสอบคอลเลกชันอีกครั้งหลังจากเปลี่ยนพรีเซ็ตหรือซับไทป์ การล้างพฤติกรรมของพรีเซ็ตอาจทำให้การตั้งค่าการมองเห็นหรือการเริ่มต้นที่พรีเซ็ตต้องการหายไป ตัวอย่างใช้รูปร่างที่มองเห็นได้และแทนที่พฤติกรรม; ไม่ได้สร้างต้นแบบการทำงานของพรีเซ็ตทั้งหมดใหม่
ความเข้ากันได้ของฟอร์แมต
ต้นไม้พฤติกรรมที่คงไว้ไม่ได้รับประกันว่าจะเล่นได้เหมือนกันในทุกโปรแกรมหรือเรนเดอร์เอาท์พุต ตรวจสอบข้อมูลที่บันทึกและผลลัพธ์ที่เรนเดอร์แยกกัน
| ฟอร์แมตหรือผลลัพธ์ | สิ่งที่ต้องตรวจสอบ |
|---|---|
| PPTX | ใช้เป็นฟอร์แมตหลักสำหรับตัวอย่างเหล่านี้ เปิดใหม่เพื่อยืนยันต้นไม้พฤติกรรมที่แก้ไขได้ แล้วตรวจสอบการเล่นใน PowerPoint เวอร์ชันที่ต้องการ |
| PPT | ตัวแทนไบนารีแบบเก่าอาจแตกต่างจาก PPTX ทดสอบวงจรบันทึก‑เปิดใหม่และการเล่น; อย่าอนุมานการสนับสนุนทุกการผสมผสานที่กำหนดจากผลลัพธ์ PPTX เพียงอย่างเดียว |
| PDF, PNG, JPEG และภาพสไลด์แบบคงที่อื่น ๆ | มีเพียงการแสดงสไลด์แบบคงที่ ไม่ใช่ไทม์ไลน์การเคลื่อนไหวที่เล่นได้ หรือเฟรมสุดท้ายของการเคลื่อนไหวที่รับประกัน |
| HTML5 | สามารถเล่นการเคลื่อนไหวที่สนับสนุนได้เมื่อเปิดใช้งาน shape animation ในตัวเลือกการส่งออก ทดสอบการผสมผสานที่กำหนดเองในเบราว์เซอร์ |
| Animated GIF | เก็บเฟรมที่เรนเดอร์ ไม่ใช่พฤติกรรมที่แก้ไขได้หรือการโต้ตอบแบบคลิก‑ทริกเกอร์ ตรวจสอบการเคลื่อนไหวที่เรนเดอร์จริง |
| Video | เรนเดอร์เฟรมการเคลื่อนไหวและเข้ารหัสเป็นวิดีโอ การสนับสนุนจำกัดอยู่ที่ supported animations and effects ของเรนเดอร์เดอร์; คำสั่งและเหตุการณ์เชิงโต้ตอบไม่กลายเป็นไทม์ไลน์ที่แก้ไขได้ |
FAQ
ทำไมเอฟเฟ็กต์ของฉันถึงมีพฤติกรรมก่อนที่ฉันจะเพิ่มอะไรลงไป?
การสร้างเอฟเฟ็กต์ที่กำหนดล่วงหน้าสามารถสร้างการทำงานพื้นฐานของมันได้ ตรวจสอบพวกมันก่อนตัดสินใจว่าจะต่อเติมพรีเซ็ตหรือแทนที่พฤติกรรม
การย้ายพฤติกรรมไปเป็นตำแหน่งแรกทำให้มันเล่นก่อนหรือไม่?
ไม่จำเป็น ลำดับคอลเลกชันไม่ใช่การแทนที่เวลา ตรวจสอบการหน่วง, ระยะเวลา, และการโต้ตอบระหว่างการทำงานบนคุณสมบัติเช่นเดียวกัน
ทำไมคำสั่ง End ถึงไม่มีจุด?
มันบ่งบอกจุดสิ้นสุดของเส้นทางและไม่ต้องการพิกัด ตรวจสอบอาร์เรย์จุดเป็น null เมื่ออ่านเส้นทางจากไฟล์
การวนรอบสำเร็จเป็นการยืนยันการเล่นหรือไม่?
ไม่ การเปิดใหม่ยืนยันการคงอยู่ของคุณสมบัติที่ตรวจสอบเท่านั้น ต้องทดสอบโปรแกรมสไลด์โชว์หรือการส่งออกแบบเคลื่อนไหวแยกต่างหากเพื่อยืนยันพฤติกรรมภาพสุดท้าย