gpt4 book ai didi

wpf - WinRT (C#/XAML) 不模糊缩放

转载 作者:可可西里 更新时间:2023-11-01 12:39:30 32 4
gpt4 key购买 nike

我制作了一个基本动画,它的控件从 0.1 缩放到 1.0 (x & y)。我始终看到的问题是,在确定最终静态状态之前,上述控件会“模糊”。

一个例子是我拍摄的这个屏幕摄像头。

Watch Screen Cam

我不确定是什么原因造成的。它是您将通过 Blend 生成的默认动画/ Storyboard。

<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="UIBorder" >
<EasingDoubleKeyFrame KeyTime="0" Value="0.2">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase EasingMode="EaseInOut"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame KeyTime="0:0:1.4" Value="1">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase EasingMode="EaseInOut" Amplitude="3"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>

所述控件:

<Grid x:Name="UIBorder" Width="555"  HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<CompositeTransform ScaleY="0.2" ScaleX="0.2"/>
</Grid.RenderTransform>

<Grid Margin="122,0,0,0" RenderTransformOrigin="0.5,0.5" >
<Border Background="#FF343434" ManipulationMode="None" IsDoubleTapEnabled="False" IsHoldingEnabled="False" IsRightTapEnabled="False" IsTapEnabled="False" RenderTransformOrigin="0.5,0.5" >
<Border.RenderTransform>
<CompositeTransform/>
</Border.RenderTransform>
</Border>
</Grid>
<Image HorizontalAlignment="Left" VerticalAlignment="Center" Source="ms-appx:///Assets/Chrome/LoginSeal.png" Stretch="None"/>
</Grid>

注意:

  • 我已经从两个独立来源(即非特定硬件)确认了 Windows 8 PC 和 Surface RT 平板电脑上的这种模糊。
  • 我试过 BitmapCache 看它是否有任何变化(变得更糟)。

最佳答案

似乎是一个错误。显然,WinRT 在动画期间自动将 CacheMode 转换为 BitmapCache,并以低比例缓存对象。虽然我无法重现您现在看到的内容,但在为 TextBlocks 的投影属性设置动画时,我在 Windows 8 的预发布版本之一中遇到了类似的问题。我认为可能发生的情况是它使用开始动画之前使用的最大控件大小来确定用于 BitmapCache 的 RenderAtScale 属性值(这在 WinRT 中不可用,但存在于 Silverlight 或 WPF 中,它似乎是它的一个版本存在于 WinRT 中,只是不向 API 用户公开)。一种解决方法可能是在加载时以某种方式无形地将位图的 ScaleX/ScaleY 值设置为 1,然后在位图首次出现之前返回到 0.2。或者,您可以在动画开始前将控件的不透明度设置为 0 并将比例设置为 1,然后在将比例设置为 0.2 后淡入控件。如果你真的需要小的在动画之前出现 - 你可以有两个控件的副本 - 一个小的在动画开始后立即消失,另一个开始大但不可见(或在 Opacity="0.005") 并在动画开始时非常快速地设置不透明度 1、缩放 0.2。

这对我来说很好:

<Page
x:Class="App76.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App76"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<Storyboard
x:Name="anim"
SpeedRatio="0.2">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)"
Storyboard.TargetName="UIBorder">
<EasingDoubleKeyFrame
KeyTime="0"
Value="0.2">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase
EasingMode="EaseInOut" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame
KeyTime="0:0:1.4"
Value="1">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase
EasingMode="EaseInOut"
Amplitude="3" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)"
Storyboard.TargetName="UIBorder">
<EasingDoubleKeyFrame
KeyTime="0"
Value="0.2">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase
EasingMode="EaseInOut" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame
KeyTime="0:0:1.4"
Value="1">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase
EasingMode="EaseInOut"
Amplitude="3" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>

</Storyboard>
</Page.Resources>
<Grid
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Grid
x:Name="UIBorder"
Width="555"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RenderTransformOrigin="0.5,0.5">
<!--<Grid.CacheMode>
<BitmapCache
/>
</Grid.CacheMode>-->
<Grid.RenderTransform>
<CompositeTransform
x:Name="ct"
ScaleY="0.2"
ScaleX="0.2" />
</Grid.RenderTransform>

<Grid
Margin="122,0,0,0"
RenderTransformOrigin="0.5,0.5">
<Border
Background="#FF343434"
ManipulationMode="None"
IsDoubleTapEnabled="False"
IsHoldingEnabled="False"
IsRightTapEnabled="False"
IsTapEnabled="False"
RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<CompositeTransform />
</Border.RenderTransform>
</Border>
</Grid>
<Image
HorizontalAlignment="Left"
VerticalAlignment="Center"
Source="ms-appx:///Assets/SplashScreen.png"
Stretch="None" />
</Grid>
<Button
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Content="TEST"
Click="ButtonBase_OnClick" />
</Grid>
</Page>

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace App76
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
ct.ScaleX = 1;
ct.ScaleY = 1;
this.Loaded += MainPage_Loaded;
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
ct.ScaleX = 0.2;
ct.ScaleY = 0.2;
}

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
anim.Begin();
}
}
}

关于wpf - WinRT (C#/XAML) 不模糊缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13870246/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com