ایجاد و اصلاح رفتارهای انیمیشن سفارشی در JavaScript

بررسی کلی

رفتارهای سفارشی انیمیشن به شما امکان می‌دهند تا عملیات‌های فردی داخل یک اثر انیمیشنی را کنترل کنید، مانند تغییر رنگ، چرخاندن شکل یا دنبال کردن مسیر حرکت قابل ویرایش. این راهنما نشان می‌دهد چگونه رفتارها را ایجاد و ترکیب کنید، زمان‌بندی آن‌ها را پیکربندی کنید، انیمیشن‌های موجود را بررسی و اصلاح کنید و اطمینان حاصل کنید که ویژگی‌های آن‌ها پس از ذخیره و بازگشایی ارائه باقی می‌مانند.

برای اثرهای از پیش تعریف شده و محرک‌های کلیک، به انیمیشن شکل مراجعه کنید.

درک مدل انیمیشن

یک انیمیشن به‌صورت Timeline → Sequence → Effect → Behaviors سازماندهی می‌شود:

  • متد getTimeline زمان‌بند اسلاید را برمی‌گرداند که شامل توالی اصلی و توالی‌های تعاملی آن است.
  • یک Sequence شامل اثرها است که ممکن است به شکل‌های مختلف هدف بدهند.
  • یک Effect یک شکل هدف، پیش تنظیم، زیرنوع و زمان‌بندی اثر را شناسایی می‌کند.
  • نگهداری که توسط Effect.getBehaviors برگردانده می‌شود، شامل عملیات‌هایی است که اثر را پیاده‌سازی می‌کنند: تغییر رنگ، جابجا شدن، چرخاندن، تنظیم یک ویژگی و غیره.

ایجاد رفتارهای فردی

برای ایجاد یک اثر و دسترسی به مجموعهٔ getBehaviors متد Sequence.addEffect را فراخوانی کنید. یک پیش تنظیم می‌تواند این مجموعه را به‌صورت خودکار پر کند. هنگام گسترش پیش تنظیم، عملیات‌های آن را نگه دارید، یا زمانی که به‌صورت آگاهانه می‌خواهید جایگزین کنید از clear استفاده کنید.

BehaviorFactory هشت نوع رفتار را که در ادامه تصویر شده‌اند ایجاد می‌کند. حرکت در بخش ساخت یک مسیر حرکت مورد بررسی قرار می‌گیرد. هر قطعه شامل واردات ماژول‌های مربوطه است و می‌تواند به‌عنوان اسکریپت Node.js با بسته‌های aspose.slides.via.java و java نصب شده اجرا شود. قبل از مثال‌های خواندن خروجی، مثال‌های ایجاد فایل را اجرا کنید. مثال‌های ویرایش بعدی مشخص می‌کنند که از کدام فایل خروجی استفاده می‌شود.

چرخش

از createRotationEffect برای ایجاد یک چرخش استفاده کنید. getBy زاویهٔ نسبی را بر حسب درجه مشخص می‌کند؛ getFrom و getTo نقاط انتهایی را تعریف می‌کنند.

مثال با یک اثر Spin شروع می‌شود، عملیات پیش تنظیم آن را با یک رفتار چرخش جایگزین می‌کند و به آن یک مدت زمان دو ثانیه می‌دهد. یک زاویهٔ نسبی ۹۰ درجه یک چرخش یک‌چهارم دور نسبت به جهت اولیهٔ شکل است، بنابراین نیازی به زاویهٔ شروع صریح نیست.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Spin, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const rotation = factory.createRotationEffect();
    rotation.setBy(90);
    rotation.getTiming().setDuration(2);

    effect.getBehaviors().add(rotation);

    presentation.save("rotation.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

rotation.pptx شامل یک شکل و یک رفتار چرخش است. مجموعه، زمان‌بندی و مثال‌های ویرایش چرخش زیر از این فایل استفاده می‌کنند.

مقیاس

از createScaleEffect با درصدهای X/Y استفاده کنید: getFrom و getTo اندازهٔ شروع و پایان را توصیف می‌کنند، در حالی که getBy تغییر نسبی را بیان می‌کند. در اینجا ۱۰۰ به معنی اندازهٔ اصلی است.

مثال هر دو بُعد را از ۱۰۰٪ به ۱۲۵٪ در دو ثانیه بزرگ می‌کند. استفاده از درصدهای مساوی افقی و عمودی نسبت شکل را حفظ می‌کند؛ درصدهای متفاوت یک بُعد را نسبت به دیگری کشیده می‌کند.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.GrowShrink, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const scale = factory.createScaleEffect();
    scale.setFrom(java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(100), java.newFloat(100)));
    scale.setTo(java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(125), java.newFloat(125)));
    scale.getTiming().setDuration(2);

    effect.getBehaviors().add(scale);

    presentation.save("scale.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

رنگ

از createColorEffect برای تغییر پر از آبی به نارنجی استفاده کنید. getFrom و getTo رنگ‌ها هستند؛ getBy یک انحراف رنگی است. Behavior.getProperties ویژگی انیمیشن‌شده را شناسایی می‌کند.

پر ثابت شکل به رنگ آبی مقداردهی اولیه می‌شود که با رنگ شروع انیمیشن مطابقت دارد. انتخاب ویژگی fill-color به رفتار می‌گوید کدام بخش از شکل تغییر کند؛ تنها نقاط انتهایی رنگ این ویژگی را شناسایی نمی‌کنند. اثر ذخیره‌شده یک انتقال دو ثانیه‌ای به نارنجی را توصیف می‌کند.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);
    shape.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
    shape.getFillFormat().getSolidFillColor().setColor(java.getStaticFieldValue("java.awt.Color", "BLUE"));

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.ChangeFillColor, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const color = factory.createColorEffect();
    color.getProperties().add(aspose.slides.BehaviorProperty.getFillColor().getValue());
    color.getFrom().setColor(java.getStaticFieldValue("java.awt.Color", "BLUE"));
    const orange = java.newInstanceSync("java.awt.Color", 255, 165, 0);
    color.getTo().setColor(orange);
    color.getTiming().setDuration(2);

    effect.getBehaviors().add(color);

    presentation.save("color.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

فیلتر

از createFilterEffect برای انتخاب یک پاک‌کن استفاده کنید. getType، getSubtype و getReveal فیلتر، جهت و اینکه شکل نمایش داده شود یا مخفی شود را مشخص می‌کنند.

این مثال یک پاک‌کن دو ثانیه‌ای که شکل را با جهت راست نشان می‌دهد، پیکربندی می‌کند. تنظیمات فیلتر به رفتار داخل اثر تعلق دارند، بنابراین پس از حذف عملیات اصلی پیش تنظیم، پیکربندی می‌شوند.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Wipe, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const filter = factory.createFilterEffect();
    filter.setType(aspose.slides.FilterEffectType.Wipe);
    filter.setSubtype(aspose.slides.FilterEffectSubtype.Right);
    filter.setReveal(aspose.slides.FilterEffectRevealType.In);
    filter.getTiming().setDuration(2);

    effect.getBehaviors().add(filter);

    presentation.save("filter.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

ویژگی

از createPropertyEffect برای انیمیشن شفافیت استفاده کنید. getFrom، getTo و getBy رشته‌هایی هستند که با استفاده از getValueType و getCalcMode تفسیر می‌شوند. به‌جای تنظیم همزمان سه مقدار، یا نقاط انتهایی یا یک انحراف نسبی را انتخاب کنید.

در اینجا ویژگی انتخاب‌شده شفافیت است و رشته‌های عددی تغییر از ۲۵٪ شفافیت به شفافیت کامل را نشان می‌دهند. درون‌یابی خطی یک تغییر تدریجی بین این مقادیر توصیف می‌کند. هنگام بکارگیری این مثال برای ویژگی دیگر، نوع مقدار و نقاط انتهایی متناسب با آن ویژگی را انتخاب کنید.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Fade, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const property = factory.createPropertyEffect();
    property.getProperties().add(aspose.slides.BehaviorProperty.getStyleOpacity().getValue());
    property.setValueType(aspose.slides.PropertyValueType.Number);
    property.setCalcMode(aspose.slides.PropertyCalcModeType.Linear);
    property.setFrom("0.25");
    property.setTo("1");
    property.getTiming().setDuration(2);

    effect.getBehaviors().add(property);

    presentation.save("property.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

تنظیم

از createSetEffect برای تعیین ویژگی visibility از طریق getTo استفاده کنید. یک رفتار set بین نقاط انتهایی درون‌یابی نمی‌کند.

مثال ویژگی visibility را انتخاب می‌کند و رشتهٔ visible را هنگام اجرای رفتار اختصاص می‌دهد. در این ارائهٔ ساده مستطیل از پیش قابل مشاهده است، بنابراین این انتساب به تنهایی تغییری واضح در تصویر ایجاد نمی‌کند. چنین عملیاتی به‌عنوان بخشی از یک اثر بزرگ‌تر مفید است که زمان نمایش یا مخفی شدن شکل را نیز کنترل می‌کند.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Appear, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const set = factory.createSetEffect();
    set.getProperties().add(aspose.slides.BehaviorProperty.getStyleVisibility().getValue());
    set.setTo("visible");

    effect.getBehaviors().add(set);

    presentation.save("set.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

دستور

از createCommandEffect استفاده کنید و getType، getCommandString و getShapeTarget را پیکربندی کنید. یک فایل صوتی WAV به نام sample.wav را در پوشهٔ کاری قرار دهید. این مثال آن را با addAudioFrameEmbedded جاسازی می‌کند و یک فرمان play را به فریم صوتی وصل می‌نماید.

فریم صوتی هم هدف اثر و هم هدف فرمان است. این اتصال درخواست پخش را به ضبط جاسازی‌شده متصل می‌کند؛ یک رشتهٔ فرمان به تنهایی شی رسانه‌ای مورد کنترل را مشخص نمی‌کند. اثر برای شروع با کلیک حین نمایش اسلاید پیکربندی شده است.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const audioStream = java.newInstanceSync("java.io.FileInputStream", "sample.wav");
    try {
        const audioFrame = slide.getShapes().addAudioFrameEmbedded(100, 100, 40, 40, audioStream);

        const effect = slide.getTimeline().getMainSequence().addEffect(audioFrame, aspose.slides.EffectType.MediaPlay, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
        effect.getBehaviors().clear();

        const factory = new aspose.slides.BehaviorFactory();
        const command = factory.createCommandEffect();
        command.setType(java.newByte(aspose.slides.CommandEffectType.Call));
        command.setCommandString("play");
        command.setShapeTarget(audioFrame);

        effect.getBehaviors().add(command);

        presentation.save("command.pptx", aspose.slides.SaveFormat.Pptx);
    } finally {
        audioStream.close();
    }
} finally {
    presentation.dispose();
}

ذخیره فرمان را در command.pptx ذخیره می‌کند؛ صدا را پخش نمی‌کند. پخش نیاز به یک پخش‌کنندهٔ اسلاید دارد که فرمان و هدف رسانه‌ای آن را پشتیبانی کند.

مدیریت مجموعه رفتارها

BehaviorCollection از متدهای add، insert، remove و removeAt پشتیبانی می‌کند. این مثال rotation.pptx را باز می‌کند، مقیاس‌بندی را اضافه می‌کند، آن را پیش از چرخش می‌گذارد و سپس چرخش را حذف می‌کند. حذف و دوباره‌درج شیء یکسان موقعیت ذخیره‌شدهٔ آن را بدون ایجاد یک کپی تغییر می‌دهد.

دنبالهٔ ویرایش‌ها مجموعه را از rotation–scale به scale–rotation و سپس به صرفاً scale تغییر می‌دهد. ایندکس‌ها به مجموعهٔ جاری اشاره دارند، بنابراین حذف از ایندکس جدید چرخش پس از reorder انجام می‌شود. شمارش نهایی تأیید می‌کند کدام رفتار ذخیره خواهد شد.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("rotation.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
    const behaviors = effect.getBehaviors();

    const factory = new aspose.slides.BehaviorFactory();
    const scale = factory.createScaleEffect();
    scale.setTo(java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(125), java.newFloat(125)));
    scale.getTiming().setDuration(2);

    behaviors.add(scale);

    behaviors.remove(scale);
    behaviors.insert(0, scale);
    behaviors.removeAt(1);

    for (let i = 0; i < behaviors.getCount(); i++) {
        const behavior = behaviors.get_Item(i);
        console.log(behavior.getClass().getSimpleName());
    }

    presentation.save("collection-edited.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

خروجی ScaleEffect است: فقط مقیاس‌گذاری باقی می‌ماند. ترتیب مجموعه به‌تنهایی رفتارها را یکی پس از دیگری زمان‌بندی نمی‌کند. تنها زمانی که تمام عملیات‌ها را جایگزین می‌کنید، مجموعه را پاک کنید.

پیکربندی زمان‌بندی رفتار

Behavior.getTiming دسترسی به Timing را مستقل از Effect.getTiming فراهم می‌کند. زمان‌بندی اثر، اثر در برگیرندهٔ خود را زمان‌بندی می‌کند؛ زمان‌بندی رفتار، یک عملیات داخل آن را توصیف می‌کند.

تنظیم مدت زمان، تأخیر، تکرار و شتاب

rotation.pptx را باز کنید و مدت زمان (getDuration) و تأخیر محرک (getTriggerDelayTime) را بر حسب ثانیه تعیین کنید، سپس تعداد تکرار را از طریق setRepeatCount پیکربندی کنید. getAccelerate و getDecelerate کسری از مدت زمان هستند؛ مجموع آن‌ها حداکثر باید ۱ باشد.

فایل ورودی همان فایلی است که در مثال چرخش ایجاد شد و اولین رفتار آن یک چرخش است. این مثال تنها زمان‌بندی آن رفتار را تغییر می‌دهد؛ زاویهٔ ۹۰ درجه دست نخورده باقی می‌ماند. نگه داشتن زاویه و زمان‌بندی به‌صورت جداگانه، تنظیم سرعت را بدون بازسازی انیمیشن آسان‌تر می‌کند.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("rotation.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);

    const rotation = effect.getBehaviors().get_Item(0);
    rotation.getTiming().setDuration(2);
    rotation.getTiming().setTriggerDelayTime(java.newFloat(0.5));
    rotation.getTiming().setRepeatCount(3);
    rotation.getTiming().setAccelerate(java.newFloat(0.2));
    rotation.getTiming().setDecelerate(java.newFloat(0.2));

    presentation.save("timing.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

این رفتار از مدت زمان دو ثانیه، تأخیر نیم‌ثانیه‌ای و تعداد تکرار ۳ بهره می‌برد. ۲۰٪ اول و آخر مدت زمان آن برای شتاب و کاهش شتاب استفاده می‌شود.

سیاست‌های تکرار دیگر شامل getRepeatDuration، getRepeatUntilEndSlide و getRepeatUntilNextClick هستند؛ یک سیاست را انتخاب کنید به‌جای فعال‌سازی همهٔ آنها به‌طور همزمان. getAutoReverse پس از پیش‌رفت، انیمیشن را به‌طرف معکوس پخش می‌کند. شتاب و کاهش شتاب بر تغییرات پیوسته اعمال می‌شوند، نه بر انتساب‌های گسسته یا دستورات.

ساخت مسیر حرکت

از createMotionEffect برای ایجاد حرکت استفاده کنید. getFrom، getTo و getBy مختصات یا جابجایی‌های مبتنی بر درصد را توصیف می‌کنند. برای مسیری قابل ویرایش، یک MotionPath ایجاد کنید و با MotionEffect.setPath آن را اختصاص دهید. MotionPath دستورات مسیر را ذخیره می‌کند.

MotionCommandPathType عملیات را انتخاب می‌کند:

دستور نقاط معنی
MoveTo یک تنظیم موقعیت شروع.
LineTo یک حرکت به‌صورت یک segment مستقیم تا نقطهٔ انتهایی آن.
CurveTo سه دنبال کردن یک منحنی مکعبی که توسط دو نقطهٔ کنترل و یک نقطهٔ انتهایی تعریف می‌شود.
CloseLoop هیچ بازگشت به موقعیت شروع.
End هیچ پایان مسیر.

MotionPathPointsType خصوصیات ویرایش نقطه را توصیف می‌کند، مانند نقاط گوشه یا صاف. این نوع جایگزین نوع دستور نمی‌شود. برای مثال منحنی زیر، از نوع نقطهٔ منحنی استفاده کنید و برای بخش‌های مستقیم از نوع نقطهٔ گوشه.

مختصات مسیر نسبت به ابعاد اسلاید نرمال‌سازی می‌شوند: جابه‌جایی X برابر ۰.۲۵ یعنی یک‌چهارم عرض اسلاید، نه ۰.۲۵ پوینت. Y مثبت به سمت پایین می‌رود. دستورات مطلق موقعیت‌ها را در سامانهٔ مختصات مسیر مشخص می‌کنند؛ دستورات نسبی جابه‌جایی‌ها را نسبت به موقعیت جاری تعریف می‌کنند. این موضوع جدا از getOrigin است که قاب مرجع مسیر را انتخاب می‌کند و getPathEditMode که نحوهٔ حرکت مسیر هنگام جابه‌جایی شکل را کنترل می‌کند.

ایجاد مسیر مستقیم

یک رفتار حرکت با نقطهٔ شروع، یک بخش مستقیم و یک دستور پایان ایجاد کنید. MotionPath.add نوع دستور، نقاط آن، نوع نقطه و پرچم مختصات نسبی را می‌گیرد.

دستور شروع (۰, ۰) را تنظیم می‌کند و خط به (۰.۲۵, ۰) می‌رسد که مسیر را یک‌چهارم عرض اسلاید افقی می‌کند. دستور پایان هیچ نقطه‌ای ندارد. پس از اختصاص مسیر، افزودن رفتار حرکت به اثر، این مسیر را به مستطیل متصل می‌کند.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.PathRight, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const motion = factory.createMotionEffect();
    motion.setOrigin(aspose.slides.MotionOriginType.Layout);
    motion.getTiming().setDuration(2);

    const path = new aspose.slides.MotionPath();
    path.add(aspose.slides.MotionCommandPathType.MoveTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Auto, false);
    path.add(aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.25), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Corner, false);
    path.add(aspose.slides.MotionCommandPathType.End, java.newArray("java.awt.geom.Point2D$Float", []), aspose.slides.MotionPathPointsType.None, false);

    motion.setPath(path);
    effect.getBehaviors().add(motion);

    presentation.save("motion.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

motion.pptx شامل یک رفتار حرکت با سه دستور مسیر است. مثال‌های ویرایش فایل زیر از این ساختار شناخته‌شده استفاده می‌کنند.

مقایسهٔ مختصات مطلق و نسبی

این دو شیء مسیر همان مسیر را توصیف می‌کنند. دستور مطلق در (۰.۳, ۰.۱) پایان می‌یابد؛ دستور نسبی (۰.۱, ۰.۱) را به موقعیت جاری (۰.۲, ۰) اضافه می‌کند.

هر دو مسیر از همان موقعیت شروع می‌شوند. برای خط نسبی، آفست‌های X و Y را به موقعیت جاری اضافه کنید تا نقطهٔ انتها به دست آید؛ برای خط مطلق، نقطهٔ انتها را مستقیماً بخوانید. تغییر پرچم بدون تبدیل مختصات مسیر متفاوتی ایجاد می‌کند.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const absolutePath = new aspose.slides.MotionPath();
absolutePath.add(aspose.slides.MotionCommandPathType.MoveTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Auto, false);
absolutePath.add(aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.3), java.newFloat(0.1))]), aspose.slides.MotionPathPointsType.Corner, false);

const relativePath = new aspose.slides.MotionPath();
relativePath.add(aspose.slides.MotionCommandPathType.MoveTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Auto, false);
relativePath.add(aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.1), java.newFloat(0.1))]), aspose.slides.MotionPathPointsType.Corner, true);

هر یک از مسیرها را به یک رفتار حرکت اختصاص دهید تا در ارائه استفاده شود. آرگومان بولی نهایی مختصات نسبی را برای آن دستور انتخاب می‌کند.

جایگزینی یک خط با منحنی

motion.pptx را باز کنید و دستور خط آن را با یک منحنی مکعبی جایگزین کنید. ابتدا دو نقطهٔ کنترل را ارائه دهید، سپس نقطهٔ انتهایی را.

موقعیت شروع توسط دستور قبلی تأمین می‌شود. دو نقطهٔ اول شکل‌دهندهٔ منحنی هستند، در حالی که سومین نقطه مقصد نهایی است؛ آن‌ها سه مقصد متوالی نیستند. به‌روز‌رسانی همزمان نوع دستور، نوع ویرایش نقطه و آرایهٔ نقاط، بخش را با هندسهٔ جدید سازگار نگه می‌دارد.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("motion.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
    const motion = effect.getBehaviors().get_Item(0);

    const path = motion.getPath();
    path.get_Item(1).setCommandType(aspose.slides.MotionCommandPathType.CurveTo);
    path.get_Item(1).setPointsType(aspose.slides.MotionPathPointsType.CurveSmooth);
    path.get_Item(1).setPoints(java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.1), java.newFloat(0)), java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0.1)), java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.3), java.newFloat(0.1))]));

    presentation.save("curve.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

مسیر در curve.pptx همچنان سه دستور دارد؛ دستور میانی آن اکنون یک منحنی را تعریف می‌کند.

بررسی و ویرایش مسیر ذخیره‌شده

هر MotionCmdPath getPoints، getCommandType، getPointsType و isRelative را در اختیار می‌گذارد. مثال‌های زیر از مسیر سه‌دستوری شناخته‌شده در motion.pptx استفاده می‌کنند. برای ورودی دلخواه، قبل از ویرایش بر اساس ایندکس، اثر مورد نظر را پیدا کنید و انواع دستورات و تعداد نقاط را بررسی کنید.

خواندن دستورات و مختصات

مسیر را بدون تغییر بخوانید. دستورات end و close-loop نیازی به نقطه ندارند، بنابراین آرایهٔ نقطه می‌تواند null باشد.

خروجی هر نوع دستور عددی را همراه با پرچم مختصات نسبی قبل از فهرست کردن نقاطش نمایش می‌دهد. این امکان را می‌دهد قبل از تغییر مسیر، نقطهٔ انتهایی را از جابجایی تشخیص دهید. یک منحنی سه نقطه، در حالی که خط مستقیم در این فایل فقط یک نقطه دارد، فهرست می‌شود.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("motion.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
    const motion = effect.getBehaviors().get_Item(0);

    const path = motion.getPath();
    for (let i = 0; i < path.getCount(); i++) {
        const segment = path.get_Item(i);
        console.log(segment.getCommandType() + ", relative: " + segment.isRelative());
        const points = segment.getPoints();
        if (points != null) {
            for (const point of points) {
                console.log("X=" + point.getX() + ", Y=" + point.getY());
            }
        }
    }
} finally {
    presentation.dispose();
}

فهرست شامل یک نقطهٔ شروع، یک خط مطلق که در (۰.۲۵, ۰) پایان می‌یابد و یک دستور end است.

تغییر نقطهٔ انتهایی

motion.pptx را باز کنید و آرایهٔ نقطهٔ خط را جایگزین کنید تا نقطهٔ انتهایی آن جابه‌جا شود.

در فایل ورودی، ایندکس ۰ دستور شروع است و ایندکس ۱ خط است. جایگزینی نقطهٔ تک‌تای این خط، مقصد آن را بدون تغییر نوع دستور، زمان‌بندی یا موقعیت در مجموعه تغییر می‌دهد. چون دستور از مختصات مطلق استفاده می‌کند، جفت جدید موقعیت را توصیف می‌کند نه یک جابجایی افزایشی.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("motion.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);

    const motion = effect.getBehaviors().get_Item(0);
    motion.getPath().get_Item(1).setPoints(java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.4), java.newFloat(0.1))]));

    presentation.save("motion-endpoint.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

خط در motion-endpoint.pptx در (۰.۴, ۰.۱) پایان می‌یابد؛ فایل اصلی دست نخورده می‌ماند.

جایگزینی یک بخش

از insert و removeAt برای جایگزینی خط در motion.pptx استفاده کنید. درج خط جدید، خط قبلی را به ایندکس ۲ می‌برد.

این روش نشان می‌دهد که به‌جای ویرایش مختصات موجود، شیء دستور را جایگزین می‌کنیم. پس از درج، مجموعه موقتاً شامل دستور شروع، خط جدید، خط قدیم و دستور end می‌شود. حذف ایندکس ۲ خط قدیم را حذف می‌کند و مسیر جدید باقی می‌ماند.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("motion.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
    const motion = effect.getBehaviors().get_Item(0);

    const path = motion.getPath();
    path.insert(1, aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0.1))]), aspose.slides.MotionPathPointsType.Corner, false);
    path.removeAt(2);

    presentation.save("motion-edited.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

مسیر ذخیره‌شده همچنان سه دستور دارد؛ خط جدید در (۰.۲, ۰.۱) پایان می‌یابد و دستور end در انتها باقی می‌ماند.

تغییر و تأیید یک رفتار موجود

وقتی ایندکس رفتار شناخته نیست، با نوع آن انتخاب کنید. این مثال rotation.pptx را باز می‌کند، RotationEffect را می‌یابد، زاویه را تغییر می‌دهد و پس از بازگشایی، مقدار ذخیره‌شده را بررسی می‌کند.

بررسی نوع، حلقه را از رفتارهای غیرچرخشی عبور می‌دهد. بار دوم فایل ذخیره‌شده را در یک شیء ارائهٔ جداگانه می‌خواند، بنابراین مقایسه داده‌های ماندگار را بررسی می‌کند نه مقدار همچنان در حافظه. این مثال هنوز فرض می‌کند اثر شناخته‌شده اولین عنصر در توالی اصلی است؛ انتخاب رفتار بر‌اساس نوع، لزوماً اثر صحیح را در ارائه‌ای دلخواه پیدا نمی‌کند.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("rotation.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);

    for (let i = 0; i < effect.getBehaviors().getCount(); i++) {
        const behavior = effect.getBehaviors().get_Item(i);
        if (java.instanceOf(behavior, "com.aspose.slides.IRotationEffect")) {
            const rotation = behavior;
            rotation.setBy(180);
        }
    }

    presentation.save("rotation-edited.pptx", aspose.slides.SaveFormat.Pptx);

    const reopened = new aspose.slides.Presentation("rotation-edited.pptx");
    try {
        const savedEffect = reopened.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);

        for (let i = 0; i < savedEffect.getBehaviors().getCount(); i++) {
            const behavior = savedEffect.getBehaviors().get_Item(i);
            if (java.instanceOf(behavior, "com.aspose.slides.IRotationEffect")) {
                const rotation = behavior;
                console.log("Rotation preserved: " + (Math.abs(rotation.getBy() - 180) < 0.001));
            }
        }
    } finally {
        reopened.dispose();
    }
} finally {
    presentation.dispose();
}

خروجی Rotation preserved: true است. همان الگوی بررسی نوع را می‌توانید برای رفتارهای دیگر به‌کار ببرید. برای بررسی کامل نگهداری، شکل هدف، اثر، انواع و ترتیب رفتارها، زمان‌بندی و دستورات مسیر را مقایسه کنید. برای مقادیر نقطه شناور از تحمل عددی استفاده کنید. برای ارائه‌ای با طرح انیمیشن ناشناخته، به Read Shape Animations برای پیمایش توالی اصلی و تعاملی مراجعه کنید.

ترتیب رفتارها، پیش تنظیم‌ها و پخش

ترتیب در BehaviorCollection ترتیب ذخیره‌شدهٔ عملیات یک اثر است. این یک لیست پخش نیست که هر رفتار به‌صورت خودکار منتظر قبلی باشد. زمان‌بندی و اثر محاط‌کننده زمان‌بندی را تعیین می‌کنند. رفتارها می‌توانند هم‌پوشانی داشته باشند و عملیات روی یک ویژگی می‌توانند از طریق getAdditive و getAccumulate با هم تعامل داشته باشند. فقط بر اساس ترتیب مجموعه برای زمان‌بندی «جابجا کردن، سپس چرخاندن» استفاده نشود؛ زمان‌بندی صریح یا اثرهای جداگانه همان‌طور که در انیمیشن شکل توضیح داده شده است، به کار ببرید.

getType و getSubtype اثر، پیش تنظیم آن را توصیف می‌کنند. اینها توصیف کاملی از درخت رفتار ویرایش‌شده نیستند. پیش تنظیم و زیرنوع را پیش از سفارشی‌سازی رفتارها انتخاب کنید: تغییر پیش تنظیم می‌تواند مجموعه را بازسازی و عملیات سفارشی شما را حذف کند. به‌عنوان مثال، تغییر یک اثر Spin سفارشی به Fade می‌تواند رفتار چرخش را با رفتارهای set و filter جایگزین کند. پس از تغییر پیش تنظیم یا زیرنوع، مجموعه را دوباره بررسی کنید. پاک کردن رفتارهای پیش تنظیم نیز می‌تواند عملیات نمایش یا مقداردهی اولیه‌ای که پیش تنظیم به آن نیاز دارد، حذف کند. مثال‌ها به‌صورتی عمدی از شکل‌های قابل مشاهده استفاده می‌کنند و رفتارها را جایگزین می‌کنند؛ آن‌ها تمام پیاده‌سازی هر پیش تنظیم را بازسازی نمی‌کنند.

سازگاری فرمت‌ها

یک درخت رفتار حفظ‌شده تضمین‌کنندهٔ پخش یکسان در همهٔ نمایشگرها یا رندرورهای خروجی نیست. داده‌های ذخیره‌شده و خروجی رندر شده را جداگانه بررسی کنید.

قالب یا خروجی چه چیزی را باید بررسی کرد
PPTX به‌عنوان فرمت اصلی برای این مثال‌ها استفاده کنید. آن را دوباره باز کنید تا درخت رفتار ویرایش‌پذیر را تأیید کنید، سپس پخش را در نسخهٔ موردنظر PowerPoint بررسی کنید.
PPT نمایش باینری قدیمی می‌تواند متفاوت از PPTX باشد. یک دورهٔ ذخیره‑و‑بازگشایی جداگانه و پخش را تست کنید؛ از موفقیت خروجی PPTX برای استنتاج پشتیبانی از هر ترکیب سفارشی استفاده نکنید.
PDF, PNG, JPEG و سایر تصاویر اسلاید ثابت شامل نمای ثابت اسلاید هستند، نه خط زمان‌پذیر قابل پخش یا فریم نهایی انیمیشن تضمین‌شده.
HTML5 می‌تواند انیمیشن‌های پشتیبانی‌شده را زمانی که انیمیشن شکل در گزینه‌های خروجی فعال باشد، پخش کند. ترکیب‌های سفارشی را در مرورگر تست کنید.
Animated GIF فریم‌های رندر شده را ذخیره می‌کند، نه رفتارهای قابل ویرایش یا تعامل کلیک‑محور. حرکت رندر شده واقعی را بررسی کنید.
Video فریم‌های انیمیشن را رندر و به‌صورت ویدیو رمزگذاری می‌کند. پشتیبانی محدود به انیمیشن‌ها و افکت‌های پشتیبانی‌شده رندرور است؛ دستورات و رویدادهای تعاملی تبدیل به خط زمان قابل ویرایش نمی‌شوند.

سؤالات متداول

چرا اثر من قبل از اضافه کردن رفتار، حاوی رفتارها است؟

ایجاد یک اثر پیش‌تنظیم‌شده می‌تواند عملیات‌های زیرساختی آن را ایجاد کند. قبل از تصمیم‌گیری برای گسترش پیش‌تنظیم یا جایگزینی رفتارها، آن‌ها را بررسی کنید.

آیا حرکت یک رفتار به ابتدای مجموعه باعث می‌شود اول پخش شود؟

لازم نیست. ترتیب مجموعه جایگزین زمان‌بندی نیست. تأخیرها، مدت زمان‌ها و تعاملات بین عملیات بر روی یک ویژگی را بررسی کنید.

چرا یک دستور end هیچ نقطه‌ای ندارد؟

این دستور پایان مسیر است و نیازی به مختصات ندارد. هنگام بررسی مسیری که از فایل خوانده می‌شود، به‌دنبال آرایهٔ نقطهٔ null باشید.

آیا یک دور رفت و آمد موفق برای تأیید پخش کافی است؟

نه. بازگشایی صرفاً حفظ ویژگی‌هایی را که بررسی کرده‌اید تأیید می‌کند. پخش‌کنندهٔ اسلایدشو یا خروجی انیمیشن را جداگانه تست کنید تا رفتار بصری آن را تأیید کنید.