zoukankan      html  css  js  c++  java
  • Windows Phone 实现类似“微博”下拉刷新效果

    请看新版本代码:

    http://www.cnblogs.com/jinzhao/archive/2012/02/27/2370424.html

    在我的O7上跑了下张善友写的博客园阅读APP,有很多体验上的想法,一时技痒想实现下拉刷新的效果。

    如果要实现下拉的效果就需要三个状态,见下图:

    第一种状态(提示下拉可以更新博客园新闻):

    第二种状态(提示下拉的幅度已够可以释放进入更新操作)

     

    第三种状态(提示正在更新,更新完毕回到第一个状态)

     

    上面这个效果为了方便独立到一个UserControl中,代码如下:

    XAML:

    <UserControl x:Class="sdkRSSReaderCS.LoadingBox"
        xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable
    ="d"
        FontFamily
    ="{StaticResource PhoneFontFamilyNormal}"
        FontSize
    ="{StaticResource PhoneFontSizeNormal}"
        Foreground
    ="{StaticResource PhoneForegroundBrush}"
        d:DesignHeight
    ="480" d:DesignWidth="480">

        <Grid x:Name="LayoutRoot">
            <StackPanel Orientation="Horizontal">
                <Grid Margin="8,0,0,0" Width="50" Height="50">
                    <Image x:Name="PulldownArrow" Width="50" Height="50" Source="/sdkRSSReaderCS;component/images/pulldown_arrow.png">
                        <Image.RenderTransform>
                            <RotateTransform x:Name="FlipTransform" CenterX="25" CenterY="25" Angle="180"/>
                        </Image.RenderTransform>
                        <Image.Resources>
                            <Storyboard x:Name="FlipDown">
                                <DoubleAnimation Storyboard.TargetName="FlipTransform"
                                   Storyboard.TargetProperty
    ="Angle"
                                   From
    ="0" To="180" Duration="0:0:0.2"/>
                            </Storyboard>
                            <Storyboard x:Name="FlipUp">
                                <DoubleAnimation Storyboard.TargetName="FlipTransform"
                                   Storyboard.TargetProperty
    ="Angle"
                                   From
    ="180" To="0" Duration="0:0:0.2"/>
                            </Storyboard>
                        </Image.Resources>
                    </Image>
                    <Image x:Name="SpinningBall" Source="/sdkRSSReaderCS;component/images/spinning_ball.png" Width="36" Height="36">
                        <Image.RenderTransform>
                            <RotateTransform x:Name="SpinTransform" CenterX="18" CenterY="18"/>
                        </Image.RenderTransform>
                        <Image.Resources>
                            <Storyboard x:Name="Spin">
                                <DoubleAnimation Storyboard.TargetName="SpinTransform"
                                   Storyboard.TargetProperty
    ="Angle"
                                   From
    ="0" To="360" Duration="0:0:1"
                                   RepeatBehavior
    ="Forever"/>
                            </Storyboard>
                        </Image.Resources>
                    </Image>
                </Grid>
                <TextBlock x:Name="TextBlock" Margin="10,0,0,0"
                     VerticalAlignment
    ="Center" FontSize="26"
                     Style
    ="{StaticResource PhoneTextExtraLargeStyle}"
                     Foreground
    ="{StaticResource PhoneAccentBrush}" />
            </StackPanel>
        </Grid>
    </UserControl>

    Cs代码:

        public partial class LoadingBox : UserControl
        {
            private string arrow;
            public static readonly DependencyProperty BusyProperty = DependencyProperty.Register("Busy"typeof(bool), typeof(LoadingBox), new PropertyMetadata(false));

            public LoadingBox()
            {
                InitializeComponent();
            }
            // Properties
            public string Arrow
            {
                get
                {
                    return this.arrow;
                }
                set
                {
                    if (this.arrow == null)
                    {
                        if (value == "Invisible")
                            this.PulldownArrow.Visibility = Visibility.Collapsed;
                        else if (value == "Up")
                        {
                            this.FlipTransform.Angle = 0.0;
                            this.PulldownArrow.Visibility = Visibility.Visible;
                        }
                        else if (value == "Down")
                        {
                            this.FlipTransform.Angle = 180.0;
                            this.PulldownArrow.Visibility = Visibility.Visible;
                        }
                    }
                    else if (value == "Invisible")
                        this.PulldownArrow.Visibility = Visibility.Collapsed;
                    else if (value == "Up")
                    {
                        if (this.arrow == "Invisible")
                        {
                            this.FlipTransform.Angle = 0.0;
                            this.PulldownArrow.Visibility = Visibility.Visible;
                        }
                        else if (this.arrow == "Down"this.FlipUp.Begin();
                    }
                    else if (value == "Down")
                    {
                        if (this.arrow == "Invisible")
                        {
                            this.FlipTransform.Angle = 180.0;
                            this.PulldownArrow.Visibility = Visibility.Visible;
                        }
                        else if (this.arrow == "Up"this.FlipDown.Begin();
                    }
                    this.arrow = value;
                }
            }

            public bool Busy
            {
                get
                {
                    return (bool)base.GetValue(BusyProperty);
                }
                set
                {
                    base.SetValue(BusyProperty, value);
                    if (value)
                    {
                        this.Arrow = "Invisible";
                        this.SpinningBall.Visibility = Visibility.Visible;
                        this.Spin.Begin();
                    }
                    else
                    {
                        this.SpinningBall.Visibility = Visibility.Collapsed;
                        this.Spin.Stop();
                    }
                }
            }

            public string Text
            {
                get
                {
                    return this.TextBlock.Text;
                }
                set
                {
                    this.TextBlock.Text = value;
                }
            }

        }

     下面是在引用的页面中的计算代码(里面的偏移量需要再具体引用的地方修改来适应相应的窗体和动作幅度):

    #region ScrollView

            private void NewsScrollViewer_Loaded(object sender, RoutedEventArgs e)
            {
                this.newsScrollViewer = sender as ScrollViewer;
            }


            private void ScrollViewer_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
            {
                this.actualOffset = this.startOffset + this.startPoint - e.ManipulationOrigin.Y;
                if (this.actualOffset < -100 && !headLoadingBox.Busy)
                {
                    Update();
                }
                if (this.actualOffset + 250 > this.newsScrollViewer.ScrollableHeight && !tailLoadingBox.Busy)
                {
                    NextPage();
                }

            }

            private void ScrollViewer_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
            {
                this.startOffset = this.newsScrollViewer.VerticalOffset;
                this.startPoint = e.ManipulationOrigin.Y;
            }

            private void ScrollViewer_MouseEnter(object sender, MouseEventArgs e)
            {
                //this.startRelativePoint = e.GetPosition(this.TopPlaceholder).Y;
            }

            private void ScrollViewer_MouseMove(object sender, MouseEventArgs e)
            {
                this.actualOffset = this.startOffset + this.startRelativePoint - e.GetPosition(this.TopPlaceholder).Y;
                if (actualOffset < -100)
                {
                    this.headLoadingBox.Arrow = "Up";
                    this.headLoadingBox.Text = "松开就可以更新!";
                }
                if (this.actualOffset + 250 > this.newsScrollViewer.ScrollableHeight && !tailLoadingBox.Busy)
                {
                    this.tailLoadingBox.Arrow = "Down";
                    this.tailLoadingBox.Text = "松开就可以更新!";
                }
            }

     有不明白的问题请留言,需要代码的请留邮箱。

  • 相关阅读:
    js日期时间补零
    判断交换机性能好坏的九个因素
    [转]document.getElementById("...") is null
    ABAP数据库操作之操作语句Insert
    abap对excel处理
    选择屏幕搜索帮助
    Screen返回选择界面的问题
    ABAP 的TABLE CONTROL实践积累
    ALV的双击使用
    双击ALV调用事务代码并传入参数
  • 原文地址:https://www.cnblogs.com/jinzhao/p/2299887.html
Copyright © 2011-2022 走看看