首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非平滑DoubleAnimation

非平滑DoubleAnimation
EN

Stack Overflow用户
提问于 2013-07-02 19:33:07
回答 4查看 944关注 0票数 6

我正在使用DoubleAnimation来放大和平移地图。我的地图是一张分辨率很高的图像(15,000 x 8,438)。问题是,第一次的变焦动画非常不稳定和不流畅,第二次变得更好,以此类推。如何使我的动画更流畅,或者在执行之前对图像或动画进行一些变现,或者使用其他形式的动画?

我的代码:

代码语言:javascript
复制
namespace AnimationTest
{

public partial class MainWindow : Window
{
    ScaleTransform transP;
    TranslateTransform trans2P;

    DoubleAnimation animP;
    DoubleAnimation animYP;
    DoubleAnimation animXP;
    TransformGroup myTransformGroupP;

    public MainWindow()
    {
        InitializeComponent();

        transP = new ScaleTransform();
        trans2P = new TranslateTransform();

        myTransformGroupP = new TransformGroup();
        myTransformGroupP.Children.Add(transP);
        myTransformGroupP.Children.Add(trans2P);

        animP = new DoubleAnimation(1, 20, TimeSpan.FromMilliseconds(3000));

        animXP = new DoubleAnimation(0, -14000, TimeSpan.FromMilliseconds(3000));
        animYP = new DoubleAnimation(0, -4000, TimeSpan.FromMilliseconds(3000));
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {

        image1.RenderTransform = myTransformGroupP;
        transP.BeginAnimation(ScaleTransform.ScaleXProperty, animP);
        transP.BeginAnimation(ScaleTransform.ScaleYProperty, animP);

        trans2P.BeginAnimation(TranslateTransform.XProperty, animXP);
        trans2P.BeginAnimation(TranslateTransform.YProperty, animYP);

    }

}
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-15 02:51:34

我没有尝试过你的动画方法,我试图实现我自己的逻辑来实现这一点。

首先,我的灵感来自于Picasa使用的缩放动画。所以我尝试实现类似类型的动画,这在我的core2duo处理器上工作得很好,图像大小为10000x5000,没有任何延迟。这种方法消耗了大量内存,但当我将我的内存使用量与Picasa ImageViewer进行比较时,它几乎是相同的。这种方法可能会增加应用程序的加载时间,但这是可以处理的,在这里不是问题。

下面是我使用的主窗口网格的代码。

代码语言:javascript
复制
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Button Grid.Row="0" Height="30" Width="100" Content="Zoom" Click="ButtonZoom_OnClick" />
    <Image RenderOptions.BitmapScalingMode="HighQuality" Stretch="Uniform" Width="100" Height="100" Grid.Row="1"
           Margin="30" VerticalAlignment="Center" HorizontalAlignment="Center" Source="mad1.jpg" Name="ImageMain"
           x:FieldModifier="private" />

</Grid>

按钮单击事件代码

代码语言:javascript
复制
private void ButtonZoom_OnClick(object sender, RoutedEventArgs e)
{
    Task.Factory.StartNew(() =>
        {
            var i = 0;
            while (i++ < 100)
            {
                var i1 = i;
                //var i1 = (-0.00092)*(i*i) + (0.092)*i + 0.2;
                Dispatcher.Invoke(new Action(() =>
                    {
                        if (i1 < 10 || i1 > 90)
                        {
                            ImageMain.Height += 0.5;
                            ImageMain.Width += 0.5;
                        }
                        else if (i1 < 30 || i1 > 70)
                        {
                            ImageMain.Height += 1;
                            ImageMain.Width += 1;
                        }
                        else
                        {
                            ImageMain.Height += 3;
                            ImageMain.Width += 3;
                        }
                    }));
                Thread.Sleep(30);
            }

        });
}

这段代码中的注释行是一个用于平滑动画的二次方程,用于动画的加速和加速。根的计算是为了开始缩放0.2和2.5的一半,并在0.2处停止,范围在0-100之间。如果要创建完全自定义的动画,可以使用WolframAlpha检查动画图形。但简单的方法是使用简单的控制语句来控制动画。

此代码仅用于缩放您的图像,您的方法将类似于缩小。

票数 4
EN

Stack Overflow用户

发布于 2013-07-11 03:02:24

你有没有研究过微软的DeepZoom技术(这是他们在必应地图上使用的技术)?http://msdn.microsoft.com/en-us/library/cc645050(v=vs.95).aspx#deep_zoom_examples

票数 3
EN

Stack Overflow用户

发布于 2013-07-13 08:11:29

由于你还没有展示任何XAML,我将尝试从最基本的开始-尝试在你的图像元素上使用RenderOptions.BitmapScalingMode="LowQuality"来减少位图缩放模式,如下所示:

代码语言:javascript
复制
<Image x:Name="image1"
       Source="huge-image.jpg"
       Stretch="Uniform"
       RenderOptions.BitmapScalingMode="LowQuality" />

请注意,由于从.NET 4.0开始,"LowQuality“设置已被设置为默认值,因此您无需显式指定它,因此只有当您以.NET 3.0-3.5为目标时,这才是实际情况。但是,如果您的放大动画仍然步履蹒跚,您可以尝试将此默认缩放比例从LowQuality更改为更低的,according to documentation

使用软件光栅化程序时,

...provides性能优于LowQuality模式。此模式通常用于放大位图。

此外,由于您将显示一些质量损失的大图像,因此在您的图像或其父元素上指定UseLayoutRounding="True"可能会更好,以提高图像质量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17424497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档