}
/// <summary>
+ /// Set minimum frame and maximum frame by marker.
+ /// Animation will play between the start frame and the end frame of the marker if one marker is specified.
+ /// Or animation will play between the start frame of the first marker and the end frame of the second marker if two markers are specified.
+ /// </summary>
+ /// <param name="marker1">First marker</param>
+ /// <param name="marker2">Second marker</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetMinAndMaxFrameByMarker(string marker1, string marker2 = null)
+ {
+ NUILog.Debug($"[AnimatedVectorImageView START[ [{GetId()}] SetMinAndMaxFrameByMarker({marker1}, {marker2})");
+
+ minimumFrameMarker = marker1;
+ maximumFrameMarker = marker2;
+ isMinMaxFrameSet = minMaxSetTypes.SetByMinAndMaxFrameByMarkerMethod;
+
+ NUILog.Debug($" [{GetId()}] minimumFrameMarker:{minimumFrameMarker}, maximumFrameMarker:{maximumFrameMarker}) ]AnimatedVectorImageView END]");
+ }
+
+ /// <summary>
/// SetMinMaxFrame(int startFrame, int endFrame)
/// </summary>
/// <param name="minFrame"></param>
}
/// <summary>
- /// A marker has its start frame and end frame.
+ /// A marker has its start frame and end frame.
/// Animation will play between the start frame and the end frame of the marker if one marker is specified.
- /// Or animation will play between the start frame of the first marker and the end frame of the second marker if two markers are specified. *
+ /// Or animation will play between the start frame of the first marker and the end frame of the second marker if two markers are specified.
/// </summary>
/// <param name="marker1">First marker</param>
/// <param name="marker2">Second marker</param>
innerCurrentFrame = 0;
break;
+ case minMaxSetTypes.SetByMinAndMaxFrameByMarkerMethod:
+ GetFrameValueFromMarkerInfo();
+ goto case minMaxSetTypes.SetByMinAndMaxFrameMethod;
+
case minMaxSetTypes.SetByMinAndMaxFrameMethod:
base.SetMinMaxFrame(minimumFrame, maximumFrame);
base.CurrentFrame = minimumFrame;
switch (isMinMaxFrameSet)
{
case minMaxSetTypes.NotSetByUser:
- switch(endAction)
+ switch (endAction)
{
case EndActions.Cancel:
innerCurrentFrame = base.CurrentFrame;
base.CurrentFrame = innerCurrentFrame = 0;
break;
case EndActions.StopFinal:
- base.CurrentFrame = innerCurrentFrame= totalFrameNum - 1;
+ base.CurrentFrame = innerCurrentFrame = totalFrameNum - 1;
break;
}
break;
+ case minMaxSetTypes.SetByMinAndMaxFrameByMarkerMethod:
+ GetFrameValueFromMarkerInfo();
+ goto case minMaxSetTypes.SetByMinAndMaxFrameMethod;
+
case minMaxSetTypes.SetByMinAndMaxFrameMethod:
switch (endAction)
{
break;
}
break;
+
case minMaxSetTypes.SetByMarker:
case minMaxSetTypes.SetByBaseSetMinMaxFrameMethod:
default:
#region Internal
+ internal void GetFrameValueFromMarkerInfo()
+ {
+ bool minimumMarkerFoundSuccess = false;
+ bool maximumMarkerFoundSuccess = false;
+ int foundedMinimumFrame = 0;
+ int foundedMaximumFrame = 0;
+
+ NUILog.Debug($" [{GetId()}] GetFrameValueFromMarkerInfo : marker = (minimumFrameMarker:{minimumFrameMarker}, maximumFrameMarker:{maximumFrameMarker})");
+
+ // Note : let we insure to get marker frame value only one time per each frame marker setter
+ if (minimumFrameMarker == null)
+ {
+ return;
+ }
+
+ var markerInfoList = GetMarkerInfo();
+ if (markerInfoList != null)
+ {
+ foreach (var markerInfo in markerInfoList)
+ {
+ if (markerInfo.Item1 == minimumFrameMarker)
+ {
+ if (maximumFrameMarker == null)
+ {
+ minimumMarkerFoundSuccess = true;
+ maximumMarkerFoundSuccess = true;
+ foundedMinimumFrame = markerInfo.Item2;
+ foundedMaximumFrame = markerInfo.Item3;
+ }
+ else
+ {
+ minimumMarkerFoundSuccess = true;
+ foundedMinimumFrame = markerInfo.Item2;
+ }
+ }
+ else if (markerInfo.Item1 == maximumFrameMarker)
+ {
+ maximumMarkerFoundSuccess = true;
+ foundedMaximumFrame = markerInfo.Item2;
+ }
+ }
+ }
+
+ if (minimumMarkerFoundSuccess && maximumMarkerFoundSuccess)
+ {
+ minimumFrame = (foundedMinimumFrame) > 0 ? foundedMinimumFrame : 0;
+ maximumFrame = (foundedMaximumFrame) > 0 ? foundedMaximumFrame : 0;
+ NUILog.Debug($" [{GetId()}] GetFrameValueFromMarkerInfo Sucess! frame set as {minimumFrame} ~ {maximumFrame} : marker = (minimumFrameMarker:{minimumFrameMarker}, maximumFrameMarker:{maximumFrameMarker})");
+ if (minimumFrame > maximumFrame)
+ {
+ NUILog.Debug($" [{GetId()}] minimumFrame:{minimumFrame} > maximumFrame:{maximumFrame})");
+ }
+ minimumFrameMarker = maximumFrameMarker = null;
+ }
+ else
+ {
+ minimumFrame = 0;
+ maximumFrame = totalFrameNum - 1;
+ NUILog.Debug($" [{GetId()}] GetFrameValueFromMarkerInfo Failed! frame set as {minimumFrame} ~ {maximumFrame} : marker = (minimumFrameMarker:{minimumFrameMarker}, maximumFrameMarker:{maximumFrameMarker})");
+ }
+ }
#endregion Internal
private int repeatCnt = 0;
private RepeatModes repeatMode = RepeatModes.Restart;
private int minimumFrame = -1, maximumFrame = -1;
+ private string minimumFrameMarker = null;
+ private string maximumFrameMarker = null;
private minMaxSetTypes isMinMaxFrameSet = minMaxSetTypes.NotSetByUser;
private int innerCurrentFrame = -1;
private EndActions innerEndAction = EndActions.Cancel;
{
NotSetByUser,
SetByMinAndMaxFrameMethod,
+ SetByMinAndMaxFrameByMarkerMethod,
SetByMarker,
SetByBaseSetMinMaxFrameMethod,
}
}
/// <summary>
+ /// Get the list of markers' information such as the start frame and the end frame in the Lottie file.
+ /// </summary>
+ /// <returns>List of Tuple (string of marker name, integer of start frame, integer of end frame)</returns>
+ // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public List<Tuple<string, int, int>> GetMarkerInfo()
+ {
+ if (currentStates.markerInfo != null)
+ {
+ return currentStates.markerInfo;
+ }
+
+ NUILog.Debug($"<");
+
+ PropertyMap imageMap = base.Image;
+ if (imageMap != null)
+ {
+ PropertyValue val = imageMap.Find(ImageVisualProperty.MarkerInfo);
+ PropertyMap markerMap = new PropertyMap();
+ if (val?.Get(ref markerMap) == true)
+ {
+ currentStates.markerInfo = new List<Tuple<string, int, int>>();
+ for (uint i = 0; i < markerMap.Count(); i++)
+ {
+ using PropertyKey propertyKey = markerMap.GetKeyAt(i);
+ string key = propertyKey.StringKey;
+
+ using PropertyValue arrVal = markerMap.GetValue(i);
+ using PropertyArray arr = new PropertyArray();
+ if (arrVal.Get(arr))
+ {
+ int startFrame = -1;
+ using PropertyValue start = arr.GetElementAt(0);
+ start?.Get(out startFrame);
+
+ int endFrame = -1;
+ using PropertyValue end = arr.GetElementAt(1);
+ end?.Get(out endFrame);
+
+ NUILog.Debug($"[{i}] marker name={key}, startFrame={startFrame}, endFrame={endFrame}");
+
+ Tuple<string, int, int> item = new Tuple<string, int, int>(key, startFrame, endFrame);
+
+ currentStates.markerInfo?.Add(item);
+ }
+ }
+ }
+ markerMap.Dispose();
+ val?.Dispose();
+ }
+ NUILog.Debug($">");
+
+ return currentStates.markerInfo;
+ }
+
+ /// <summary>
/// A marker has its start frame and end frame.
/// Animation will play between the start frame and the end frame of the marker if one marker is specified.
/// Or animation will play between the start frame of the first marker and the end frame of the second marker if two markers are specified. *
internal float scale;
internal PlayStateType playState;
internal List<Tuple<string, int, int>> contentInfo;
+ internal List<Tuple<string, int, int>> markerInfo;
internal string mark1, mark2;
internal bool redrawInScalingDown;
internal bool enableFrameCache;