HRESULT CarouselThumbnailAnimation::Setup(D2D1_POINT_2F targetPoint, double targetOpacity, double duration) { // Animation objects ComPtr<IUIAnimationManager> animationManager; ComPtr<IUIAnimationTimer> animationTimer; ComPtr<IUIAnimationTransitionLibrary> transitionLibrary; ComPtr<IUIAnimationStoryboard> storyboard; // Transition objects ComPtr<IUIAnimationTransition> pointXTransition; ComPtr<IUIAnimationTransition> pointYTransition; ComPtr<IUIAnimationTransition> opacityTransition; // Retrieve animation objects HRESULT hr = AnimationUtility::GetAnimationManager(&animationManager); if (SUCCEEDED(hr)) { hr = AnimationUtility::GetTransitionLibrary(&transitionLibrary); } if (SUCCEEDED(hr)) { hr = AnimationUtility::GetAnimationTimer(&animationTimer); } // Initialize storyboard if (SUCCEEDED(hr)) { hr = animationManager->CreateStoryboard(&storyboard); // Create one transition for each orbit variable if (SUCCEEDED(hr)) { hr = transitionLibrary->CreateLinearTransition(duration, targetPoint.x, &pointXTransition); if (SUCCEEDED(hr)) { hr = storyboard->AddTransition(m_pointX, pointXTransition); } } if (SUCCEEDED(hr)) { hr = transitionLibrary->CreateLinearTransition(duration, targetPoint.y, &pointYTransition); if (SUCCEEDED(hr)) { hr = storyboard->AddTransition(m_pointY, pointYTransition); } } if (SUCCEEDED(hr)) { hr = transitionLibrary->CreateLinearTransition(duration, targetOpacity, &opacityTransition); if (SUCCEEDED(hr)) { hr = storyboard->AddTransition(m_opacity, opacityTransition); } } if (SUCCEEDED(hr)) { hr = AnimationUtility::ScheduleStoryboard(storyboard); } } return hr; }
// Build storyboard for the animation HRESULT SlideAnimation::BuildStoryboard() { ComPtr<IUIAnimationStoryboard> storyboard; HRESULT hr = S_OK; // clear all the previous animation points m_animationPoints.clear(); // Initialize animation variables if necessary if (nullptr == m_animationManager) { hr = Initialize(); } if (SUCCEEDED (hr)) { hr = m_animationManager->CreateStoryboard(&storyboard); } if (SUCCEEDED (hr)) { // Populate all the animated thumbnail cells for ( auto animatedCell = m_animatedThumbnailCells.begin(); animatedCell < m_animatedThumbnailCells.end(); animatedCell++) { D2D1_POINT_2F startPoint = animatedCell->start; D2D1_POINT_2F endPoint = animatedCell->end; ComPtr<IUIAnimationTransition> xTransition, yTransition; // Create animation variables LineAnimationVar animationVar; hr = m_animationManager->CreateAnimationVariable(startPoint.x, &(animationVar.animationX)); if (SUCCEEDED (hr)) { hr = m_animationManager->CreateAnimationVariable(startPoint.y, &(animationVar.animationY)); } // Add a transition for the animation variable if (SUCCEEDED (hr)) { hr = m_transitionLibrary->CreateAccelerateDecelerateTransition(m_duration, endPoint.x, m_accelerationRatio , m_decelerationRatio , &xTransition); } if (SUCCEEDED (hr)) { hr = storyboard->AddTransition(animationVar.animationX, xTransition); } if (SUCCEEDED (hr)) { hr = m_transitionLibrary->CreateConstantTransition(m_duration, &yTransition); } if (SUCCEEDED (hr)) { hr = storyboard->AddTransition(animationVar.animationY, yTransition); } // Store the pair of animation variable and thumbnail control m_animationPoints.insert(LineAnimationPair(animatedCell->cell.control, animationVar)); } } // Schedule storyboard if (SUCCEEDED (hr)) { hr = AnimationUtility::ScheduleStoryboard(storyboard); } return hr; }
HRESULT CarouselThumbnailAnimation::Setup(D2D1_POINT_2F keyFramePoint, D2D1_POINT_2F targetPoint, double duration) { // Animation objects ComPtr<IUIAnimationManager> animationManager; ComPtr<IUIAnimationTimer> animationTimer; ComPtr<IUIAnimationTransitionLibrary> transitionLibrary; ComPtr<IUIAnimationStoryboard> storyboard; // Transition objects ComPtr<IUIAnimationTransition> transitionX1; ComPtr<IUIAnimationTransition> transitionY1; ComPtr<IUIAnimationTransition> transitionX2; ComPtr<IUIAnimationTransition> transitionY2; // Retrieve animation objects HRESULT hr = AnimationUtility::GetAnimationManager(&animationManager); if (SUCCEEDED(hr)) { hr = AnimationUtility::GetTransitionLibrary(&transitionLibrary); } if (SUCCEEDED(hr)) { hr = AnimationUtility::GetAnimationTimer(&animationTimer); } // Initialize storyboard if (SUCCEEDED(hr)) { hr = animationManager->CreateStoryboard(&storyboard); // Add keyframe to increase the time of the first transition UI_ANIMATION_SECONDS keyFrameStartTime = duration * 0.2; UI_ANIMATION_KEYFRAME keyframe1; hr = storyboard->AddKeyframeAtOffset( UI_ANIMATION_KEYFRAME_STORYBOARD_START, keyFrameStartTime, &keyframe1); // Use initial point to determine whether or not to do first transition double initialPointY; hr = m_pointY->GetValue(&initialPointY); if (initialPointY > keyFramePoint.y) { if (SUCCEEDED(hr)) { hr = transitionLibrary->CreateAccelerateDecelerateTransition( keyFrameStartTime, keyFramePoint.x, 0.0, 1.0, &transitionX1); } if (SUCCEEDED(hr)) { hr = storyboard->AddTransition(m_pointX, transitionX1); } if (SUCCEEDED(hr)) { hr = transitionLibrary->CreateAccelerateDecelerateTransition( keyFrameStartTime, keyFramePoint.y, 1.0, 0.0, &transitionY1); if (SUCCEEDED(hr)) { hr = storyboard->AddTransition(m_pointY, transitionY1); } } } else { keyFrameStartTime = 0.0; } if (SUCCEEDED(hr)) { hr = transitionLibrary->CreateAccelerateDecelerateTransition( duration - keyFrameStartTime, targetPoint.x, 1.0, 0.0, &transitionX2); if (SUCCEEDED(hr)) { if (initialPointY > keyFramePoint.y) { hr = storyboard->AddTransitionAtKeyframe(m_pointX, transitionX2, keyframe1); } else { hr = storyboard->AddTransition(m_pointX, transitionX2); } } } if (SUCCEEDED(hr)) { hr = transitionLibrary->CreateAccelerateDecelerateTransition( duration - keyFrameStartTime, targetPoint.y, 0.0, 1.0, &transitionY2); if (SUCCEEDED(hr)) { if (initialPointY > keyFramePoint.y) { hr = storyboard->AddTransitionAtKeyframe(m_pointY, transitionY2, keyframe1); } else { hr = storyboard->AddTransition(m_pointY, transitionY2); } } } if (SUCCEEDED(hr)) { hr = AnimationUtility::ScheduleStoryboard(storyboard); } } return hr; }
// // Sets up a new animation using the specified distance and duration // HRESULT PanAnimation::Setup(double startPosition, double targetPosition, double duration) { // Animation objects ComPtr<IUIAnimationManager> animationManager; ComPtr<IUIAnimationTimer> animationTimer; ComPtr<IUIAnimationTransitionLibrary> transitionLibrary; ComPtr<IUIAnimationStoryboard> storyboard; // Transition objects ComPtr<IUIAnimationTransition> instantTransition; ComPtr<IUIAnimationTransition> panTransition; // Retrieve animation objects HRESULT hr = AnimationUtility::GetAnimationManager(&animationManager); if (SUCCEEDED(hr)) { hr = AnimationUtility::GetTransitionLibrary(&transitionLibrary); } if (SUCCEEDED(hr)) { hr = AnimationUtility::GetAnimationTimer(&animationTimer); } // Initialize storyboard if (SUCCEEDED(hr)) { hr = animationManager->CreateStoryboard(&storyboard); if (SUCCEEDED(hr)) { hr = transitionLibrary->CreateInstantaneousTransition(startPosition, &instantTransition); if (SUCCEEDED(hr)) { hr = storyboard->AddTransition(m_panValue, instantTransition); } } if (SUCCEEDED(hr)) { hr = transitionLibrary->CreateAccelerateDecelerateTransition( duration, targetPosition, 0.25, 0.25, &panTransition); if (SUCCEEDED(hr)) { hr = storyboard->AddTransition(m_panValue, panTransition); } } if (SUCCEEDED(hr)) { hr = AnimationUtility::ScheduleStoryboard(storyboard); } } return hr; }