Smooth pinch-zooming and panning on Windows Phone 8

后端 未结 3 1369
渐次进展
渐次进展 2020-12-17 15:38

I\'ve managed to implement pinch zooming and panning by hooking up to the ManipulationDelta and ManipulationStarted events (on an image control):

    private         


        
相关标签:
3条回答
  • 2020-12-17 15:58

    I know it's a late answer but here's another sample project which could help to resolve this problem http://code.msdn.microsoft.com/wpapps/Smooth-flick-and-zoom-with-7760c7f7

    0 讨论(0)
  • 2020-12-17 16:05

    I wanted to get this right from a mathematical point of view. The result is something similar in correctness to Telerik's PanAndZoomImage. If you aren't interested, jump straight to this gist (It works with WP7.1+). You'll need to reference System.Windows.Interactivity and the Windows Phone toolkit.

    Usage:

    <Image Source="http://i.imgur.com/ZbKlRzK.jpg">
        <i:Interaction.Behaviors>
            <phoneApp1:PanAndZoomBehavior MaxZoom="10" />
        </i:Interaction.Behaviors>
    </Image>
    

    Math

    Panning and zooming uses 2 out of 4 transformations of CompositeTransform, namely Translation and Scaling. The key point is understanding how to compose two of those scale+translate transforms. I'll use haskellish notation, because it is less of burden to type and read. Our 'primitives' are

    1. scale s = scale around (s.x,s.y) with factor s.x in x direction and s.y in y direction
    2. translate t = offset all points by t.x in x direction and t.y in y direction

    CompositeTransform scales around a center point, which is expressed like

    scaleAround c s = translate c . scale s . translate -c
    

    The following rules hold (do the math if you don't believe me, all operators are componentwise):

    1. translate a . translate b = translate (a+b)
    2. scale a . scale b = scale (a*b)
    3. translate t . scale s = scale s . translate (t/s)

    A CompositeTransform is like

    transform s c t = translate t . scaleAround c s
                    = translate (t+c) . scale s . translate -c
    

    When composing two of those transforms, we have to move around primitives until we get to such a form above. Let a and b be those two CompositeTransforms. So we get:

    transform' = b . a
               = translate bt . scaleAround bc bs . translate at . scaleAround ac as
               = translate bt . translate bc . scale bs . translate -bc . translate at . translate ac . scale as . translate -ac
               = translate (bt+bc) . scale bs . translate (ac+at-bc) . scale as . translate -ac
               = translate (bt+bc) . translate (ac+at-bc)*bs . scale bs . scale as . translate -ac
               = translate (bt+bc+(ac+at-bc)*bs) . scale (as*bs) . translate -ac
               = translate (bt+bc-ac+(ac+at-bc)*bs) . scaleAround ac (as*bs)
               = translate (bt+at*bs+(bs-1)*(ac-bs)) . scaleAround ac (as*bs)
    

    This is just because I was frustrated with the amount of profound documentation on why certain people do certain things.

    For the actual composition code, looko here

    0 讨论(0)
  • 2020-12-17 16:13

    I know you're talking about 8 and I'll post a link to an article related to 7, but it was very useful when playing around with Windows Phone so here it goes:

    https://www.wintellect.com/building-touch-interfaces-for-windows-phones-part-3/

    I don't imagine that much has changed since then...

    0 讨论(0)
提交回复
热议问题