When the Windows Phone 7 Developer SDK was released a couple
of weeks ago at MIX10 many people noticed the SDK doesnt include a template for a Panorama
control. Here at Clarity we decided to build our own Panorama
control for use in some
of our prototypes and I figured I would share what we came up with. There have been a couple
of implementations
of the Panorama
control making their way through the interwebs, but I didnt think any
of them really nailed the experience that is shown in the simulation videos. One
of the key design principals in the UX Guide for Windows Phone 7 is the use
of motion. The WP7 OS is fairly stripped
of extraneous design elements and makes heavy use
of typography and motion to give users the necessary visual cues. Subtle animations and wide layouts help give the user a sense
of fluidity and consistency across the phone experience. When building the panorama
control I was fairly meticulous in recreating the motion as shown in the videos. The effect that is shown in the application hubs
of the phone is known as a Parallax Scrolling effect. This this pseudo-3D technique has been around in the computer graphics world for quite some time. In essence, the background images move slower than foreground images, creating an illusion
of depth in 2D. Here is an example
of the traditional use: http://www.mauriciostudio.com/. One
of the animation gems I've learned while building interactive software is the follow animation. The premise is straightforward: instead
of translating content 1:1 with the interaction point, let the content catch up to the mouse or finger. The difference is subtle, but the impact on the smoothness
of the interaction is huge. That said, it became the foundation
of how I achieved the effect shown below. Source Code Available HERE Before I briefly describe the approach I took in creating this
control..and Ill add some **asterisks ** to the code below as my coding skills arent up to snuff with the rest
of my colleagues. This code is meant to be an interpretation
of the WP7 panorama
control and is not intended to be used in a production application. 1. Layout the XAML The UI consists
of three main components : The background image, the Title, and the Content. You can imagine each these UI Elements existing on their own plane with a corresponding Translate Transform to create the Parallax effect. 2. Storyboards + Procedural Animations = Sexy As I mentioned above, creating a fluid experience was at the top
of my priorities while building this
control. To recreate the smooth scroll effect shown in the video we need to add some place holder storyboards that we can manipulate in code to simulate the inertia and snapping. Using the easing functions built into Silverlight helps create a very pleasant interaction. 3. Handle the Manipulation Events With Silverlight 3 we have some new touch event handlers. The new Manipulation events makes handling the interactivity pretty straight forward. There are two event handlers that need to be hooked up to enable the dragging and motion effects: the ManipulationDelta event : (the most relevant code is highlighted in pink) Here we are doing some simple math with the Manipulation Deltas and setting the TO values
of the animations appropriately. Modifying the storyboards dynamically in code helps to create a natural feel.something that cant easily be done with storyboards alone. And secondly, the ManipulationCompleted event: Here we take the Final Velocities from the Manipulation Completed Event and apply them to the Storyboards to create the snapping and scrolling effects. Most
of this code is determining what the next position
of the viewport will be. The interesting part (shown in pink) is determining the duration
of the animation based on the calculated velocity
of the flick gesture. By using velocity as a variable in determining the duration
of the animation we can produce a slow animation for a soft flick and a fast animation for a strong flick. Challenges to the Reader There are a couple
of things I didnt have time to implement into this
control. And I would love to see other WPF/Silverlight approaches. 1. A good mechanism for deciphering when the user is manipulating the content within the panorama
control and the panorama itself. In other words, being able to accurately determine what is a flick and what is click. 2. Dynamically Sizing the panorama
control based on the width
of its content. Right now each
control panel is 400px, ideally the Panel items would be measured and then panorama
control would update its size accordingly. 3. Background and content wrapping. The WP7 UX guidelines specify that the content and background should wrap at the end
of the list. In my code I restrict the drag at the ends
of the list (like the iPhone). It would be interesting to see how this would effect the scroll experience. Well, Its been fun building this
control and if you use it Id love to know what you think. You can download the Source HERE or from the Expression Gallery Erik Klimczak |
[email protected] | twitter.com/eklimczDid you know that DotNetSlackers also publishes .net articles written by top known .net Authors? We already have over 80 articles in several categories including Silverlight. Take a look: here.