Search code examples
xamlanimationvisual-studio-2013windows-phone-8-sdk

How to animate images in windows phone 8 apps development?


I need image zooming of background image during run-time process and image animation in windows phone 8 apps development when starting my screen


Solution

  • First, we'll create a basic image hovering in the middle of a grid:

    <Grid x:Name="ContentPanel">
        <Image Source="Assets\Headset.png" 
               Width="200" Height="150"
               ManipulationDelta="Image_ManipulationDelta"
               x:Name="img"
               >
            <Image.RenderTransform>
                <CompositeTransform CenterX="100" CenterY="75" />
            </Image.RenderTransform>
        </Image>
    </Grid>
    

    Next, we'll handle the ManipulationDelta event, check if it's a Pinch Manipulation and apply the correct Silverlight transformations on our UIElement.

    private void Image_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
    {
        if (e.PinchManipulation != null)
        {
            var transform = (CompositeTransform)img.RenderTransform;
    
            // Scale Manipulation
            transform.ScaleX = e.PinchManipulation.CumulativeScale;
            transform.ScaleY = e.PinchManipulation.CumulativeScale;
    
            // Translate manipulation
            var originalCenter = e.PinchManipulation.Original.Center;
            var newCenter = e.PinchManipulation.Current.Center;
            transform.TranslateX = newCenter.X - originalCenter.X;
            transform.TranslateY = newCenter.Y - originalCenter.Y;
    
            // Rotation manipulation
            transform.Rotation = angleBetween2Lines(
                e.PinchManipulation.Current, 
                e.PinchManipulation.Original);
    
            // end 
            e.Handled = true;
        }
    }
    
    // copied from http://www.developer.nokia.com/Community/Wiki/Real-time_rotation_of_the_Windows_Phone_8_Map_Control
    public static double angleBetween2Lines(PinchContactPoints line1, PinchContactPoints line2)
    {
        if (line1 != null && line2 != null)
        {
            double angle1 = Math.Atan2(line1.PrimaryContact.Y - line1.SecondaryContact.Y,
                                       line1.PrimaryContact.X - line1.SecondaryContact.X);
            double angle2 = Math.Atan2(line2.PrimaryContact.Y - line2.SecondaryContact.Y,
                                       line2.PrimaryContact.X - line2.SecondaryContact.X);
            return (angle1 - angle2) * 180 / Math.PI;
        }
        else { return 0.0; }
    }
    

    Here's what we did:

    • Scaling: PinchManipulation actually tracks scaling for us, so all we had to do is apply PinchManipulation.CumulativeScale to the scaling factor.
    • Transform: PinchManipulation tracks the original center and the new center (calculated between the two touch points). By subtracting the new center from the old center we can tell how much the UIElement needs to move and apply that to a translate transform. Note that a better solution here would also account for multiple Manipulation sessions by tracking cumulative original centers which this code doesn't.
    • Rotation: We figured out the angle between the two touch points and applied it as the rotation transform.