`

wp win8开发:scrollview滑动动画效果

    博客分类:
  • wp
wp 
阅读更多
产品需求,暂别ios开发,着手win8开发。

说说这个scrollview滑动的动画效果吧,郁闷的是它不像ios中的uiscrollview提供了很多api,动画都集成的很好

我在做一个内容展示页面的时候,参考zarker在处理,所以不得不让scrollview滑动起来,在网上看了一些人写的,很是郁闷,估计都是抄袭一个人的,我也顺手抄了过来,反复修改调试,今天终于跑起来了,下面提供一下我修改后的代码:



圈起来的detailpage就是要处理的page。。。。

在这个page的cs文件中上代码:

   /// <summary>
        /// ////////////////////////////////////////////////////////////////////////////////////
        /// </summary>
        public static DependencyProperty CurrentVerticalOffsetProperty =
            DependencyProperty.Register("CurrentVerticalOffset",
            typeof(double),
            typeof(DetailPage),
            new PropertyMetadata(0, new PropertyChangedCallback(OnVerticalChanged))
        );
        public static DependencyProperty CurrentHorizontalOffsetProperty =
            DependencyProperty.Register("CurrentHorizontalOffset",
            typeof(double),
            typeof(DetailPage),
            new PropertyMetadata(0, new PropertyChangedCallback(OnHorizontalChanged))
        );
        public static DependencyProperty CurrentZoomFactorProperty =
            DependencyProperty.Register("CurrentZoomFactor",
            typeof(float),
            typeof(DetailPage),
            new PropertyMetadata(0, new PropertyChangedCallback(OnCurrentZoomFactor))
        );

        public double CurrentVerticalOffset
        {
            get
            {
                return Convert.ToDouble(this.GetValue(CurrentVerticalOffsetProperty));
            }
            set
            {
                this.SetValue(CurrentVerticalOffsetProperty, value);
            }
        }

       private static void OnVerticalChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DetailPage viewer = d as DetailPage;
            double dTop = Convert.ToDouble(e.NewValue);
            viewer.sc.ScrollToVerticalOffset(dTop * viewer.sc.ZoomFactor);
        }

       public double CurrentHorizontalOffset
       {
           get
           {
               return Convert.ToDouble(this.GetValue(CurrentHorizontalOffsetProperty));
           }
           set
           {
               this.SetValue(CurrentHorizontalOffsetProperty, value);
           }
       }

        private static void OnHorizontalChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DetailPage viewer = d as DetailPage;
            double dLeft = Convert.ToDouble(e.NewValue);
            viewer.sc.ScrollToHorizontalOffset(dLeft * viewer.sc.ZoomFactor);
        }

        public float CurrentZoomFactor
        {
            get
            {
                return Convert.ToSingle(this.GetValue(CurrentZoomFactorProperty));
            }
            set
            {
                this.SetValue(CurrentZoomFactorProperty, value);
            }
        }

        private static void OnCurrentZoomFactor(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            try
            {
                DetailPage viewer = d as DetailPage;
                float zoomFactor = Convert.ToSingle(e.NewValue);
                viewer.sc.ZoomToFactor(zoomFactor);
            }
            catch
            {
                System.Diagnostics.Debug.WriteLine(string.Format(@"exception:zoomFactor"));
            }
        }

        private void ScrollToRect(Rect rect)
        {
            float curZoomFactor = this.sc.ZoomFactor;
            float desZoomFactor = (float)Math.Min(sc.ViewportWidth / rect.Width, sc.ViewportHeight / rect.Height);

            double curHorizontalOffsetInContent = sc.HorizontalOffset / sc.ZoomFactor;
            double curVerticalOffsetInContent = sc.VerticalOffset / sc.ZoomFactor;



            this.CurrentVerticalOffsetAnimation.From = curVerticalOffsetInContent;
            this.CurrentVerticalOffsetAnimation.To = rect.Top - (sc.ViewportHeight / desZoomFactor - rect.Height) / 2;

            this.CurrentHorizontalOffsetAnimation.From = sc.HorizontalOffset;
            this.CurrentHorizontalOffsetAnimation.To = rect.X;

            this.ZoomFactorAnimation.From = curZoomFactor;
            this.ZoomFactorAnimation.To = desZoomFactor;



            ZoomToFaceStoryBoard.Begin();

        } 



       //在初始化方法中添加 监听view滑动事件

         itemListV1.ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.TranslateY;
         //itemListV1.ManipulationStarted += OnManipulationStarted;
         itemListV1.ManipulationCompleted += OnManipulationCompleted;

        public void OnManipulationCompleted(Object sender, ManipulationCompletedRoutedEventArgs e)
        {
            //System.Diagnostics.Debug.WriteLine("123");
            int direction = 0;

            ScrollViewer viewer = sc;
            if (viewer == null)
                return;

            double offset = sc.HorizontalOffset;
           

            ManipulationVelocities velocities = e.Velocities;
            Point point = velocities.Linear;

            if (point.X < 0)
            {
                System.Diagnostics.Debug.WriteLine("Swipe left");
                direction = (int)XhxwWin8.Constants.InfoConstants.SWIPE_DIRECTION_TYPE.SWIPE_DIRECTION_LEFT;

            }
            else
            {
                System.Diagnostics.Debug.WriteLine("Swipe Right");
                direction = (int)XhxwWin8.Constants.InfoConstants.SWIPE_DIRECTION_TYPE.SWIPE_DIRECTION_RIGHT;

           }   

            if (direction == (int)XhxwWin8.Constants.InfoConstants.SWIPE_DIRECTION_TYPE.SWIPE_DIRECTION_LEFT)
            {

                if (offset != viewer.ScrollableWidth )
                {
                    offset = offset + viewer.ViewportWidth;
                    ScrollToRect(new Rect(offset, 0, viewer.ViewportWidth, viewer.ViewportHeight));
                }

               

            }
            else if (direction == (int)XhxwWin8.Constants.InfoConstants.SWIPE_DIRECTION_TYPE.SWIPE_DIRECTION_RIGHT)
            {

                if (offset != 0.0)
                {
                    offset = offset - viewer.ViewportWidth;
                    ScrollToRect(new Rect(offset, 0, viewer.ViewportWidth, viewer.ViewportHeight));
                }
               
            }

          
        }



中的提一下这个方法OnManipulationCompleted,他是处理滑动事件时的方法,里面我顺便判断了一下滑动方向,然后处理一下scrollview的offset,然后调用 ScrollToRect这个方法,ScrollToRect是处理动画属性,并且运行动画效果。



下面我上一下xaml中的代码部分:

<Grid.Resources>

                <Storyboard x:Name="ZoomToFaceStoryBoard" >
                    <DoubleAnimation x:Name="ZoomFactorAnimation" 
                                 EnableDependentAnimation ="True" 
                                 Storyboard.TargetName="pageRoot"  
                                 Storyboard.TargetProperty="CurrentZoomFactor"  
                                 Duration="0:0:0.5"></DoubleAnimation>
                    <DoubleAnimation x:Name="CurrentHorizontalOffsetAnimation" 
                                 EnableDependentAnimation ="True" 
                                 Storyboard.TargetName="pageRoot"  
                                 Storyboard.TargetProperty="CurrentHorizontalOffset"  
                                 Duration="0:0:0.5"></DoubleAnimation>
                    <DoubleAnimation x:Name="CurrentVerticalOffsetAnimation" 
                                 EnableDependentAnimation ="True" 
                                 Storyboard.TargetName="pageRoot"  
                                 Storyboard.TargetProperty="CurrentVerticalOffset"  
                                 Duration="0:0:0.5"></DoubleAnimation>

                </Storyboard>
            </Grid.Resources>

上面是在我的布局grid中定义的动画



<ScrollViewer x:Name="sc"
                          Padding="60,0,60,0"
                          Background="Transparent"
                          Grid.Row="1"
                          IsHitTestVisible="True"
                          HorizontalScrollBarVisibility="Hidden"
                          HorizontalScrollMode="Enabled"      
                          ScrollViewer.IsHorizontalScrollChainingEnabled="True"
                          ScrollViewer.IsDeferredScrollingEnabled="True"
                          ScrollViewer.IsVerticalScrollChainingEnabled="False"
                          ScrollViewer.VerticalScrollMode="Disabled"
                          ScrollViewer.VerticalScrollBarVisibility="Disabled"
                          ManipulationMode="All"
                          ManipulationCompleted="sc_ManipulationCompleted"
                          >

//此处我添加的是<common:RichTextColumns x:Name="richTextColumns"> </common:RichTextColumns>
</ScrollViewer>



我也是初学c#以及win8开发,上面功能只是为了达到实现的目的,没有仔细封装,见谅...

分享到:
评论

相关推荐

    ios-类似scrollView滑动的一个动画,但不是scrollView.zip

    在iOS开发中,我们经常需要实现各种滑动和滚动效果,比如常见的UIScrollView,它提供了页面滚动、上下滑动以及左右滑动的能力。然而,有些情况下,我们可能希望创建一种更特殊的滑动效果,比如抽屉式的动画效果。这...

    ScrollView滑动悬停效果

    8. **自定义ScrollView**:如果默认的ScrollView功能不足以满足需求,可以考虑创建自定义ScrollView,重写`onScrollChanged()`方法,实现自定义的滑动悬停逻辑。 9. **测试与适配**:确保在不同尺寸和方向的设备上...

    Unity实现ScrollView滑动吸附功能

    本文实例为大家分享了Unity实现ScrollView滑动吸附的具体代码,供大家参考,具体内容如下 最近在做一个展示模块的时候遇到了一个需要实现滑动窗口并且能固定吸附距离的需求,借助UGUI的ScrollView的API以及Dotween...

    实现ScrollView滑动时标题栏的隐藏效果(我自己写了例子)

    在Android开发中,实现ScrollView滑动时标题栏的隐藏效果是一项常见的需求,它可以为用户提供更加沉浸式的浏览体验。本文将详细讲解如何通过自定义布局和监听ScrollView的滚动事件来达到这个目的。 首先,我们需要...

    Android,自定义ScrollView,实现过度滑动时回弹效果

    本主题关注的是如何自定义一个ScrollView,使其在用户过度滑动后产生回弹效果,这种效果通常被称为“橡皮筋”效果或“弹性”效果。这个效果在iOS中很常见,而在Android中则需要我们手动实现。接下来,我们将深入探讨...

    自定义动画框架实现ScrollView滚动动画

    在Android开发中,自定义动画框架的实现是一个高级且实用的技术点,特别是在处理ScrollView滚动时的子控件动画。这不仅能够提升应用的用户体验,也能展现出开发者精湛的技术水平。以下将详细讲解如何实现一个自定义...

    Scrollview滑动,并且单个页面也实现放大缩小,滑回来可还原

    接下来,我们要在CustomScrollView内部嵌套一个HorizontalScrollView或者ViewPager,因为ScrollView只能垂直滑动,而我们要实现水平滑动的效果。HorizontalScrollView或ViewPager可以用来承载多个页面,每个页面是一...

    安卓scrollview动画滚动到顶部

    在Android开发中,ScrollView是一个非常常用的布局控件,它允许用户在内容超出屏幕时通过滚动查看更多的信息。本文将深入探讨如何实现一个ScrollView动画滚动到顶部的功能,这在很多应用场景中都非常有用,例如用户...

    UnityUGUI实现ScrollView 滑动居中的放大、其他的缩小,简单实现方法

    UnityUGUI实现ScrollView 滑动居中的放大、其他的缩小,简单实现方法 配套资源文章:https://blog.csdn.net/lq1340817945/article/details/121001075

    android scrollview 滑动指定位置

    在Android开发中,ScrollView是一个非常常用的布局控件,它允许用户在内容超出屏幕时通过滚动来查看所有内容。本文将详细讲解如何使ScrollView滑动到指定的位置,以便于实现更丰富的交互体验。首先,我们需要理解...

    监听Scrollview滑动到最左边与最右边

    总之,监听ScrollView滑动到最左边与最右边是Android开发中的常见需求,通过设置OnScrollChangeListener并分析滚动坐标,我们可以轻松实现这一功能。在项目中,这些监听事件通常被用来优化用户体验,提供更丰富的...

    Android ScrollView向上滑动控件顶部悬浮效果实现

    本文将详细讲解如何实现ScrollView向上滑动时,控件顶部悬浮的效果,这种效果通常被称为“头部固定”或“吸顶”效果,常见于各种应用的导航栏或者工具栏。 首先,我们需要理解这个效果的基本原理。当用户在...

    Android开发实战经典-020701-滚动视图:ScrollView源代码和视频教程.zip

    Android开发实战经典_020701_滚动视图:ScrollView源代码和视频教程.zip

    ScrollView 滑动title渐变效果

    在Android开发中,ScrollView是一种常用的布局控件,用于承载可滚动的内容。当用户滚动ScrollView时,如果想要实现标题(Title)的渐变效果,这通常涉及到动画和自定义视图的知识点。以下将详细讲解如何在ScrollView...

    Android:ScrollView中嵌套ViewPager和ListView示例

    5. 动画和过渡效果:在ScrollView中使用ViewPager或ListView时,可能需要自定义动画和过渡效果,以提供更好的用户体验。 综上所述,虽然在ScrollView中嵌套ViewPager和ListView可能带来一些挑战,但通过合理的设计...

    android完美解决listView与ScrollView滑动冲突

    在Android开发中,ListView和ScrollView是两种常用的布局控件,分别用于展示大量可滚动的数据列表和容纳多个视图。然而,当ListView被嵌套在ScrollView内时,它们之间的滑动冲突是一个常见的问题。本篇文章将深入...

    ScrollView滑动到底、顶、中部

    用于对ScrollView滑动的监听,如滑动到顶部,内部封装了对应的方法,只需要使用此自定义布局便可

    ScrollView+TableView滑动分层效果

    总之,"ScrollView+TableView滑动分层效果"是一种高级的iOS界面交互技术,涉及到ScrollView和TableView的联动,以及手势识别和动画的应用。掌握这种技术能够提升应用的用户体验,使得应用界面更加生动和有趣。通过...

    弹性拉伸Scrollview、scrollview嵌套listview和scrollview滑动监听demo

    在Android开发中,ScrollView是一种常用的布局控件,用于允许用户滚动查看超过屏幕大小的内容。本文将深入探讨如何实现“弹性拉伸”的ScrollView、在ScrollView中嵌套ListView以及添加ScrollView的滑动监听。这些...

    ScrollView嵌套ScrollView滑动

    在Android开发中,ScrollView是一种常用的布局控件,用于允许用户滚动查看超过屏幕大小的内容。当一个ScrollView内嵌套另一个ScrollView时,可能会遇到一些滑动事件处理的问题。这种情况下,我们需要理解Android事件...

Global site tag (gtag.js) - Google Analytics