About the Layer effects animation in ArcMap Sample
[C#]
MapLayerEffectsKeyframe.cs
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using ESRI.ArcGIS.Animation; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.SystemUI; using ESRI.ArcGIS.esriSystem; namespace AnimationDeveloperSamples { [Guid("965a7a4e-6371-427a-b8f7-ca433c262dc8")] [ClassInterface(ClassInterfaceType.None)] [ProgId("AnimationDeveloperSamples.MapLayerEffectsKeyframe")] public class MapLayerEffectsKeyframe:IAGKeyframe,IAGKeyframeUI { private ILongArray activeProps; private IAGAnimationType animType; private string name; private bool bObjectsNeedRefresh; private short brightness; private short contrast; private double timeStamp; #region constructor public MapLayerEffectsKeyframe() { activeProps = new LongArrayClass(); activeProps.Add(0); activeProps.Add(1); animType = new AnimationTypeLayerEffects(); name = ""; bObjectsNeedRefresh = false; brightness = 0; contrast = 0; timeStamp = 0; } #endregion #region IAGKeyframe members public ILongArray ActiveProperties { get { return activeProps; } set { activeProps = value; } } public IAGAnimationType AnimationType { get { return animType; } } public void Apply(IAGAnimationTrack pTrack, IAGAnimationContainer pContainer, object pObject) { SetBrightness((ILayer)pObject, brightness); SetContrast((ILayer)pObject, contrast); pContainer.RefreshObject(pObject); return; } public void CaptureProperties(IAGAnimationContainer pContainer, object pObject) { contrast = GetContrast((ILayer)pObject); brightness = GetBrightness((ILayer)pObject); } public void Interpolate(IAGAnimationTrack pTrack, IAGAnimationContainer pContainer, object pObject, int propertyIndex, double time, IAGKeyframe pNextKeyframe, IAGKeyframe pPrevKeyframe, IAGKeyframe pAfterNextKeyframe) { if (time < TimeStamp || time > pNextKeyframe.TimeStamp) return; double timeFactor; timeFactor = (time - TimeStamp) / (pNextKeyframe.TimeStamp - TimeStamp); //ignoring pPrevKeyframe and pAfterNextKeyframe if (propertyIndex == 0) //interpolate brightness { short brightnessInterpolated; short brightnessStart; short brightnessEnd; brightnessStart = brightness; brightnessEnd = System.Convert.ToInt16(pNextKeyframe.get_PropertyValue(0)); brightnessInterpolated = System.Convert.ToInt16(timeFactor * (brightnessEnd - brightnessStart) + brightnessStart); SetBrightness((ILayer)pObject, brightnessInterpolated); bObjectsNeedRefresh = true; } else //interpolate contrast { short contrastInterpolated; short contrastStart; short contrastEnd; contrastStart = contrast; contrastEnd = System.Convert.ToInt16(pNextKeyframe.get_PropertyValue(1)); contrastInterpolated = System.Convert.ToInt16(timeFactor * (contrastEnd - contrastStart) + contrastStart); SetContrast((ILayer)pObject, contrastInterpolated); bObjectsNeedRefresh = true; } return; } public bool get_IsActiveProperty(int propIndex) { bool bIsActive = false; int count = activeProps.Count; for (int i = 0; i < count; i++) { long temp = activeProps.get_Element(i); if (temp == propIndex) bIsActive = true; } return bIsActive; } public void set_IsActiveProperty(int propIndex, bool pbIsActiveProp) { if (pbIsActiveProp) { if (get_IsActiveProperty(propIndex) == false) { activeProps.Add(propIndex); } } else { if (get_IsActiveProperty(propIndex) == true) { int i=0; int count = activeProps.Count; for (i = 0; i < count; i++) { long temp = activeProps.get_Element(i); if (temp == propIndex) break; } activeProps.Remove(i); } } } public string Name { get { return name; } set { name = value; } } public bool ObjectNeedsRefresh { get { return bObjectsNeedRefresh; } } public object get_PropertyValue(int propIndex) { if (propIndex == 0) return brightness; else if (propIndex == 1) return contrast; else return null; } public void set_PropertyValue(int propIndex, object pValue) { if (propIndex == 0) brightness = Convert.ToInt16(pValue); else if (propIndex == 1) contrast = Convert.ToInt16(pValue); else return; } public void RefreshObject(IAGAnimationTrack pTrack, IAGAnimationContainer pContainer, object pObject) { bObjectsNeedRefresh = false; pContainer.RefreshObject(pObject); } public double TimeStamp { get { return timeStamp; } set { timeStamp = value; } } #endregion #region IAGKeyframeUI members public string GetText(int propIndex, int columnIndex) { string text; text = null; switch (propIndex) { case 0: { text = System.Convert.ToString(brightness); } break; case 1: text = System.Convert.ToString(contrast); break; } return text; } public void SetText(int propIndex, int columnIndex, string text) { switch (propIndex) { case 0: { brightness = System.Convert.ToInt16(text); } break; case 1: { contrast = System.Convert.ToInt16(text); } break; } return; } #endregion #region private methods private short GetBrightness(ILayer layer) { ILayerEffects layerEffects = (ILayerEffects)layer; return layerEffects.Brightness; } private void SetBrightness(ILayer layer, short brtness) { ILayerEffects layerEffects = (ILayerEffects)layer; layerEffects.Brightness = brtness; return; } private short GetContrast(ILayer layer) { ILayerEffects layerEffects = (ILayerEffects)layer; return layerEffects.Contrast; } private void SetContrast(ILayer layer, short ctr) { ILayerEffects layerEffects = (ILayerEffects)layer; layerEffects.Contrast = ctr; return; } #endregion } }
[Visual Basic .NET]
MapLayerEffectsKeyframe.vb
Imports Microsoft.VisualBasic Imports System Imports System.Collections.Generic Imports System.Text Imports System.Runtime.InteropServices Imports ESRI.ArcGIS.Animation Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.SystemUI Imports ESRI.ArcGIS.esriSystem Namespace AnimationDeveloperSamples <Guid("EB5D227B-4814-4720-877B-D19519B2BBD6"), ClassInterface(ClassInterfaceType.None), ProgId("AnimationDeveloperSamples.MapLayerEffectsKeyframe")> _ Public Class MapLayerEffectsKeyframe : Implements IAGKeyframe, IAGKeyframeUI Private activeProps As ILongArray Private animType As IAGAnimationType Private keyframeName As String Private bObjectsNeedRefresh As Boolean Private brightness As Short Private contrast As Short Private timeStamp1 As Double #Region "constructor" Public Sub New() activeProps = New LongArrayClass() activeProps.Add(0) activeProps.Add(1) animType = New AnimationTypeLayerEffects() keyframeName = "" bObjectsNeedRefresh = False brightness = 0 contrast = 0 timeStamp1 = 0 End Sub #End Region #Region "IAGKeyframe members" Public Property ActiveProperties() As ILongArray Implements IAGKeyframe.ActiveProperties Get Return activeProps End Get Set(ByVal value As ILongArray) activeProps = value End Set End Property Public ReadOnly Property AnimationType() As IAGAnimationType Implements IAGKeyframe.AnimationType Get Return animType End Get End Property Public Sub Apply(ByVal pTrack As IAGAnimationTrack, ByVal pContainer As IAGAnimationContainer, ByVal pObject As Object) Implements IAGKeyframe.Apply SetBrightness(CType(pObject, ILayer), brightness) SetContrast(CType(pObject, ILayer), contrast) pContainer.RefreshObject(pObject) Return End Sub Public Sub CaptureProperties(ByVal pContainer As IAGAnimationContainer, ByVal pObject As Object) Implements IAGKeyframe.CaptureProperties contrast = GetContrast(CType(pObject, ILayer)) brightness = GetBrightness(CType(pObject, ILayer)) End Sub Public Sub Interpolate(ByVal pTrack As IAGAnimationTrack, ByVal pContainer As IAGAnimationContainer, ByVal pObject As Object, ByVal propertyIndex As Integer, ByVal time As Double, ByVal pNextKeyframe As IAGKeyframe, ByVal pPrevKeyframe As IAGKeyframe, ByVal pAfterNextKeyframe As IAGKeyframe) Implements IAGKeyframe.Interpolate If time < TimeStamp OrElse time > pNextKeyframe.TimeStamp Then Return End If Dim timeFactor As Double timeFactor = (time - TimeStamp) / (pNextKeyframe.TimeStamp - TimeStamp) 'ignoring pPrevKeyframe and pAfterNextKeyframe If propertyIndex = 0 Then 'interpolate brightness Dim brightnessInterpolated As Short Dim brightnessStart As Short Dim brightnessEnd As Short brightnessStart = brightness brightnessEnd = System.Convert.ToInt16(pNextKeyframe.PropertyValue(0)) brightnessInterpolated = System.Convert.ToInt16(timeFactor * (brightnessEnd - brightnessStart) + brightnessStart) SetBrightness(CType(pObject, ILayer), brightnessInterpolated) bObjectsNeedRefresh = True Else 'interpolate contrast Dim contrastInterpolated As Short Dim contrastStart As Short Dim contrastEnd As Short contrastStart = contrast contrastEnd = System.Convert.ToInt16(pNextKeyframe.PropertyValue(1)) contrastInterpolated = System.Convert.ToInt16(timeFactor * (contrastEnd - contrastStart) + contrastStart) SetContrast(CType(pObject, ILayer), contrastInterpolated) bObjectsNeedRefresh = True End If Return End Sub Public Property IsActiveProperty(ByVal propIndex As Integer) As Boolean Implements IAGKeyframe.IsActiveProperty Get Dim bIsActive As Boolean = False Dim count As Integer = activeProps.Count Dim i As Integer = 0 Do While i < count Dim temp As Long = activeProps.Element(i) If temp = propIndex Then bIsActive = True End If i += 1 Loop Return bIsActive End Get Set(ByVal value As Boolean) If value Then If IsActiveProperty(propIndex) = False Then activeProps.Add(propIndex) End If Else If IsActiveProperty(propIndex) = True Then Dim i As Integer = 0 Dim count As Integer = activeProps.Count i = 0 Do While i < count Dim temp As Long = activeProps.Element(i) If temp = propIndex Then Exit Do End If i += 1 Loop activeProps.Remove(i) End If End If End Set End Property Public Property Name() As String Implements IAGKeyframe.Name Get Return keyframeName End Get Set(ByVal value As String) keyframeName = value End Set End Property Public ReadOnly Property ObjectNeedsRefresh() As Boolean Implements IAGKeyframe.ObjectNeedsRefresh Get Return bObjectsNeedRefresh End Get End Property Public Property PropertyValue(ByVal propIndex As Integer) As Object Implements IAGKeyframe.PropertyValue Get If propIndex = 0 Then Return brightness ElseIf propIndex = 1 Then Return contrast Else Return Nothing End If End Get Set(ByVal value As Object) If propIndex = 0 Then brightness = Convert.ToInt16(value) ElseIf propIndex = 1 Then contrast = Convert.ToInt16(value) Else Return End If End Set End Property Public Sub RefreshObject(ByVal pTrack As IAGAnimationTrack, ByVal pContainer As IAGAnimationContainer, ByVal pObject As Object) Implements IAGKeyframe.RefreshObject bObjectsNeedRefresh = False pContainer.RefreshObject(pObject) End Sub Public Property TimeStamp() As Double Implements IAGKeyframe.TimeStamp Get Return timeStamp1 End Get Set(ByVal value As Double) timeStamp1 = value End Set End Property #End Region #Region "IAGKeyframeUI members" Public Function GetText(ByVal propIndex As Integer, ByVal columnIndex As Integer) As String Implements IAGKeyframeUI.GetText Dim text As String text = Nothing Select Case propIndex Case 0 text = System.Convert.ToString(brightness) Case 1 text = System.Convert.ToString(contrast) End Select Return text End Function Public Sub SetText(ByVal propIndex As Integer, ByVal columnIndex As Integer, ByVal text As String) Implements IAGKeyframeUI.SetText Select Case propIndex Case 0 brightness = System.Convert.ToInt16(text) Case 1 contrast = System.Convert.ToInt16(text) End Select Return End Sub #End Region #Region "private methods" Private Function GetBrightness(ByVal layer As ILayer) As Short Dim layerEffects As ILayerEffects = CType(layer, ILayerEffects) Return layerEffects.Brightness End Function Private Sub SetBrightness(ByVal layer As ILayer, ByVal brtness As Short) Dim layerEffects As ILayerEffects = CType(layer, ILayerEffects) layerEffects.Brightness = brtness Return End Sub Private Function GetContrast(ByVal layer As ILayer) As Short Dim layerEffects As ILayerEffects = CType(layer, ILayerEffects) Return layerEffects.Contrast End Function Private Sub SetContrast(ByVal layer As ILayer, ByVal ctr As Short) Dim layerEffects As ILayerEffects = CType(layer, ILayerEffects) layerEffects.Contrast = ctr Return End Sub #End Region End Class End Namespace