- 浏览: 59872 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (93)
- java (3)
- ios (9)
- wp (15)
- android (0)
- js (1)
- 服务器 (0)
- db (0)
- linux (1)
- python (0)
- xcode (0)
- ide (2)
- maven (0)
- spring (0)
- sql (0)
- 第三方 (1)
- nexus (0)
- nginx (11)
- tomcat (0)
- jenkins (0)
- zookeeper (1)
- git (1)
- svn (0)
- uml (0)
- redis (4)
- activemq (1)
- flume (0)
- kafka (0)
- mysql (1)
- memcached (0)
- mybatis (0)
- mac (0)
- mongo (1)
- docker (6)
- cache (0)
- jvm (0)
- markdown (0)
- springboot (24)
- mycat (3)
- LTS (3)
- 运维 (0)
- opts (1)
- netty (1)
- tcc (0)
- ffmpeg (2)
- 直播 (6)
- cxf (0)
- nodejs (0)
- storm (0)
- elasticjob (0)
- php (0)
最新评论
产品需求,暂别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开发,上面功能只是为了达到实现的目的,没有仔细封装,见谅...
说说这个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开发,上面功能只是为了达到实现的目的,没有仔细封装,见谅...
发表评论
-
wp wp8:自定义Button图片背景
2017-01-10 17:11 334自定义一个返回按钮,以下是我的操作。 内容部分也是在网上 ... -
wp wp8:指定通信资源(端口)已由另一个应用程序使用 错误
2017-01-10 17:06 411测试机器是820t时,一直正常运行,后来改用920t的时候安装 ... -
wp wp8:自定义控件 自定义progressbar
2017-01-11 13:31 348MProgress.cs using System; usi ... -
wp wp8:服务器推送
2017-01-11 13:32 427前提:必须使用真机,真机注册 服务器端使用的是winform ... -
wp wp8:lbs
2017-01-12 10:51 448上码:不解释 using System; using Sys ... -
wp wp8:计划通知
2017-01-10 17:06 406using System; using System.Coll ... -
wp wp8:后台任务
2017-01-10 17:10 395MScheduledTaskAgent项目下 Schedule ... -
wp wp8:页面转换 page transitions
2017-01-12 10:47 527首先导入Toolkit.dll文件 将App.xaml.cs ... -
wp wp8:公共样式定义
2017-02-07 10:12 477在Resources下创建一个名称为buttonStyle.x ... -
wp wp8:后台传输服务
2017-01-11 13:27 4551.TransferPreferences属性设置: 后台传 ... -
wp wp8:自定义dll库创建
2017-01-11 13:28 491鉴于项目测试: 创建一个wp8项目 在解决方案下 右键 操 ... -
wp wp8:sqlite安装
2017-01-12 10:47 467打开vs 检测一下时候安装了sqlite for window ... -
wp wp8:手势GuestureService/GuestureListener
2017-01-12 10:51 5581.利用Silverlight Tookit中提供的手势服务监 ... -
wp wp8&win8:Stretch的Uniform和UniformToFill
2017-01-12 10:51 586Uniform,控件的高度和宽度会增加直到达到了容器的大小,也 ...
相关推荐
在iOS开发中,我们经常需要实现各种滑动和滚动效果,比如常见的UIScrollView,它提供了页面滚动、上下滑动以及左右滑动的能力。然而,有些情况下,我们可能希望创建一种更特殊的滑动效果,比如抽屉式的动画效果。这...
8. **自定义ScrollView**:如果默认的ScrollView功能不足以满足需求,可以考虑创建自定义ScrollView,重写`onScrollChanged()`方法,实现自定义的滑动悬停逻辑。 9. **测试与适配**:确保在不同尺寸和方向的设备上...
本文实例为大家分享了Unity实现ScrollView滑动吸附的具体代码,供大家参考,具体内容如下 最近在做一个展示模块的时候遇到了一个需要实现滑动窗口并且能固定吸附距离的需求,借助UGUI的ScrollView的API以及Dotween...
在Android开发中,实现ScrollView滑动时标题栏的隐藏效果是一项常见的需求,它可以为用户提供更加沉浸式的浏览体验。本文将详细讲解如何通过自定义布局和监听ScrollView的滚动事件来达到这个目的。 首先,我们需要...
本主题关注的是如何自定义一个ScrollView,使其在用户过度滑动后产生回弹效果,这种效果通常被称为“橡皮筋”效果或“弹性”效果。这个效果在iOS中很常见,而在Android中则需要我们手动实现。接下来,我们将深入探讨...
在Android开发中,自定义动画框架的实现是一个高级且实用的技术点,特别是在处理ScrollView滚动时的子控件动画。这不仅能够提升应用的用户体验,也能展现出开发者精湛的技术水平。以下将详细讲解如何实现一个自定义...
接下来,我们要在CustomScrollView内部嵌套一个HorizontalScrollView或者ViewPager,因为ScrollView只能垂直滑动,而我们要实现水平滑动的效果。HorizontalScrollView或ViewPager可以用来承载多个页面,每个页面是一...
在Android开发中,ScrollView是一个非常常用的布局控件,它允许用户在内容超出屏幕时通过滚动查看更多的信息。本文将深入探讨如何实现一个ScrollView动画滚动到顶部的功能,这在很多应用场景中都非常有用,例如用户...
UnityUGUI实现ScrollView 滑动居中的放大、其他的缩小,简单实现方法 配套资源文章:https://blog.csdn.net/lq1340817945/article/details/121001075
在Android开发中,ScrollView是一个非常常用的布局控件,它允许用户在内容超出屏幕时通过滚动来查看所有内容。本文将详细讲解如何使ScrollView滑动到指定的位置,以便于实现更丰富的交互体验。首先,我们需要理解...
总之,监听ScrollView滑动到最左边与最右边是Android开发中的常见需求,通过设置OnScrollChangeListener并分析滚动坐标,我们可以轻松实现这一功能。在项目中,这些监听事件通常被用来优化用户体验,提供更丰富的...
本文将详细讲解如何实现ScrollView向上滑动时,控件顶部悬浮的效果,这种效果通常被称为“头部固定”或“吸顶”效果,常见于各种应用的导航栏或者工具栏。 首先,我们需要理解这个效果的基本原理。当用户在...
Android开发实战经典_020701_滚动视图:ScrollView源代码和视频教程.zip
在Android开发中,ScrollView是一种常用的布局控件,用于承载可滚动的内容。当用户滚动ScrollView时,如果想要实现标题(Title)的渐变效果,这通常涉及到动画和自定义视图的知识点。以下将详细讲解如何在ScrollView...
5. 动画和过渡效果:在ScrollView中使用ViewPager或ListView时,可能需要自定义动画和过渡效果,以提供更好的用户体验。 综上所述,虽然在ScrollView中嵌套ViewPager和ListView可能带来一些挑战,但通过合理的设计...
在Android开发中,ListView和ScrollView是两种常用的布局控件,分别用于展示大量可滚动的数据列表和容纳多个视图。然而,当ListView被嵌套在ScrollView内时,它们之间的滑动冲突是一个常见的问题。本篇文章将深入...
用于对ScrollView滑动的监听,如滑动到顶部,内部封装了对应的方法,只需要使用此自定义布局便可
总之,"ScrollView+TableView滑动分层效果"是一种高级的iOS界面交互技术,涉及到ScrollView和TableView的联动,以及手势识别和动画的应用。掌握这种技术能够提升应用的用户体验,使得应用界面更加生动和有趣。通过...
在Android开发中,ScrollView是一种常用的布局控件,用于允许用户滚动查看超过屏幕大小的内容。本文将深入探讨如何实现“弹性拉伸”的ScrollView、在ScrollView中嵌套ListView以及添加ScrollView的滑动监听。这些...
在Android开发中,ScrollView是一种常用的布局控件,用于允许用户滚动查看超过屏幕大小的内容。当一个ScrollView内嵌套另一个ScrollView时,可能会遇到一些滑动事件处理的问题。这种情况下,我们需要理解Android事件...