UWP xaml波纹效果(android效果)动画

2023-12-11

我尝试在 UWP 应用程序中编写 Android 效果(波纹)。因此,我在网格内创建了一个 EllipseGeometry (在我的用户控件中),但是当我的 ellipseGeometry 的 RadiusX 和 RadiusY 播放动画时,我的 EllipseGeometry 会从网格中增长出来...... 我尝试用可见区域限制路径并将其剪切到路径,但没有成功。

这是我的 XAML 代码:

<UserControl
x:Class="UIComponents.POIButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:UIComponents"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="100"
d:DesignWidth="650" Background="White">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Gray">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="100"/>
    </Grid.ColumnDefinitions>
    <!--Animation Ellipse-->
    <Grid x:Name="ellipseContainer" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="0" Grid.ColumnSpan="3">
        <Path x:Name="path" Fill="Red" Stroke="Black" StrokeThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5">
            <Path.Data>
                <EllipseGeometry x:Name="circleGeometry" Center="0,0" RadiusX="5" RadiusY="5" />
            </Path.Data>
        </Path>
    </Grid>
    <Rectangle x:Name="clickableRect" Grid.Column="0" Grid.ColumnSpan="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  PointerPressed="clickableRect_PointerPressed"  Fill="Transparent" Tapped="clickableRect_Tapped"/>
</Grid>
<UserControl.Resources>
    <Storyboard x:Name="RipplePath">
        <DoubleAnimationUsingKeyFrames EnableDependentAnimation="True" Storyboard.TargetProperty="RadiusX" Storyboard.TargetName="circleGeometry">
            <EasingDoubleKeyFrame KeyTime="0" Value="5"/>
            <EasingDoubleKeyFrame KeyTime="0:0:10" Value="200"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames EnableDependentAnimation="True" Storyboard.TargetProperty="RadiusY" Storyboard.TargetName="circleGeometry">
            <EasingDoubleKeyFrame KeyTime="0" Value="5"/>
            <EasingDoubleKeyFrame KeyTime="0:0:10" Value="200"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</UserControl.Resources>

这是我的 Cs 代码:

private void clickableRect_Tapped(object sender, TappedRoutedEventArgs e)
    {
        Point touchPosition = e.GetPosition(ellipseContainer);
        //RectangleGeometry visibleArea = new RectangleGeometry();
        //visibleArea.Rect = new Rect(0, 0, 650, 100);
        //path.Clip = visibleArea;
        Storyboard animation = this.FindName("RipplePath") as Storyboard;
        animation.Begin();

    }

在这里,结果:

enter image description here

非常感谢你的帮助 :)

============== 尝试 Justin XL 的解决方案:结果:

感谢贾斯汀的帮助,看来矩形几何也被动画化了:

enter image description here

但网格上什么也没有。

Xaml代码是:

<UserControl
x:Class="UIComponents.POIButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:UIComponents"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="100"
d:DesignWidth="650" Background="White">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Gray">
    <Grid.Clip>
        <RectangleGeometry Rect="0,0,650,100" />
    </Grid.Clip> ...

CS代码是:

public POIButton()
    {
        this.InitializeComponent();
        var visual = ElementCompositionPreview.GetElementVisual(this);
        visual.Clip = visual.Compositor.CreateInsetClip();
    }

================ XAML 结果:

此 XAML 代码不会产生正确的效果:

<UserControl
x:Class="UIComponents.POIButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:UIComponents"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Height="100"
Width="650" Background="White">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Gray">
    <Grid.Clip>
        <RectangleGeometry Rect="0,0,650,100" />
    </Grid.Clip>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="100"/>
    </Grid.ColumnDefinitions>
    <!--Animation Ellipse-->
    <Grid x:Name="ellipseContainer" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="0" Grid.ColumnSpan="3">
        <Path x:Name="path" Fill="Red" Stroke="Black" StrokeThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5">
            <Path.Data>
                <EllipseGeometry x:Name="circleGeometry" Center="0,0" RadiusX="5" RadiusY="5" />
            </Path.Data>
        </Path>
    </Grid>...

Result : enter image description here

但 CS 代码工作正常(在 XAML 代码中注释 RectangleGeometry 行):

this.InitializeComponent();
        var visual = ElementCompositionPreview.GetElementVisual(this);
        visual.Clip = visual.Compositor.CreateInsetClip();

产生这个:

enter image description here

感谢@Justin XL 的帮助:)


您只需要将控件限制在其边界之外即可。这可以通过使用以下任一方法来实现

<Grid x:Name="Root" HorizontalAlignment="Stretch"
      VerticalAlignment="Stretch"
      Background="Gray">
    <Grid.Clip>
        <RectangleGeometry Rect="0,0,200,80" />
    </Grid.Clip>

在你的 XAML(200是宽度和80是高度),或者

public POIButton()
{
    InitializeComponent();

    var visual = ElementCompositionPreview.GetElementVisual(this);
    visual.Clip = visual.Compositor.CreateInsetClip();
}

在新的代码隐藏中合成API。请注意,如果控件的大小发生变化,则使用 XAML 方法时,您需要通过绑定或代码隐藏来手动更新宽度和高度,而使用 Composition 则不需要。

另外,我注意到您使用了在 UI 线程上运行的路径动画(例如EnableDependentAnimation)。这可以替换为Ellipse with a ScaleTransform动画通常是推荐的方法,因为它的性能要好得多。


产生“涟漪”效应XamlLight

由于您正在针对 UWP 进行开发,因此重要的是要了解该平台可以做什么,以及实现类似效果的 UWP 方式,但仍尊重其自身的优势流畅的设计系统.

我创建了以下内容FluentButton借助新的控制如下所示XamlLight类引入于15063。您会注意到灯光跟随您的鼠标光标,并且在单击/点击时它会产生波纹。

enter image description here

第二部分由定制完成XamlLight我称之为RippleXamlLight,这就是它的实现方式 -

首先,创建一个继承自的类XamlLight.

public class RippleXamlLight : XamlLight

然后,在其OnConnected覆盖方法,创建一个SpotLight实例和一个Vector3将用于为灯光设置动画Offset。它还将负责订阅指针事件,例如PointerPressed.

protected override void OnConnected(UIElement newElement)
{
    _compositor = Window.Current.Compositor;

    var spotLight = CreateSpotLight();
    CompositionLight = spotLight;

    _lightRippleOffsetAnimation = CreateLightRippleOffsetAnimation();

    SubscribeToPointerEvents();

    AddTargetElement(GetId(), newElement);

    ...
    }
}

最后,每当按下控件时就启动动画。这Offset值由指针位置和一个提供_rippleOffsetZ这是根据控件的大小计算的。

private void OnPointerPressed(object sender, PointerRoutedEventArgs e) =>
    StartLightRippleOffsetAnimation(e.GetCurrentPoint((UIElement)sender).Position.ToVector2());

private void StartLightRippleOffsetAnimation(Vector2 position)
{
    var startingPoisition = new Vector3(position, 0.0f);
    _lightRippleOffsetAnimation?.InsertKeyFrame(0.0f, startingPoisition);
    _lightRippleOffsetAnimation?.InsertKeyFrame(1.0f, new Vector3(position.X, position.Y, _rippleOffsetZ));

    CompositionLight?.StartAnimation("Offset", _lightRippleOffsetAnimation);
}

如果我解释得不够清楚,这是完整源码供你参考。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UWP xaml波纹效果(android效果)动画 的相关文章

  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • Google Wallet for Digital Goods API 与 Google Play 应用内结算

    想知道 Google 电子钱包结算 API 和 Google Play 应用内结算之间有什么区别 与 Google 电子钱包结算 API 相比 使用 GooglePlay 应用内购买结算服务有何优势 我看到 Wallet API 也支持 A
  • Eclipse 在 Android SDK 内容加载器处挂起

    我已经在 OS X 10 8 2 上使用 Eclipse 4 2 Juno 版本 20120920 0800 几个星期了 为 Android 3 0 及更高版本构建应用程序 我有一台带 SSD 的四核 i7 MacBook Pro 因此性能
  • Android - 在图像/缩略图上覆盖播放按钮的最佳方式

    我有一个 Android 应用程序 可以播放音频 视频并显示图片 对于视频 我想在预览图像顶部以及列表视图中叠加一个播放按钮 现在我的做法是使用 xml 中的 ImageView 然后可绘制对象是一个图层图层列表 我以编程方式定义它 因为其
  • 如何在移动应用程序上连接到服务器?

    我是移动应用程序的新手 我基本上来自网络开发平台 我只是在玩 App Framework LungoJS Jquery Mobile kendo 等移动框架 以获得该垂直领域的一些知识 我正在开发的应用程序仍然处于 UI 级别 我所需要的只
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • 使用 matplotlib.animation 从 CSV 文件实时绘图 - 数据绘制到第一个输入错误

    我正在尝试绘制来自不断写入 CSV 文件的传感器的数据 虽然成功创建实时绘图 但每个新数据条目都会创建一条延伸到第一个数据条目的附加线 见下文 Python 3 4 脚本 import matplotlib pyplot as plt im
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • Android:是否可以在可绘制选择器中使用字符串/枚举?

    问题 Q1 有人设法让自定义字符串 枚举属性在 xml 选择器中工作吗 我通过以下 1 获得了一个布尔属性 但不是字符串属性 编辑 感谢您的回答 目前 android 仅支持布尔选择器 原因请参阅已接受的答案 我计划实现一个复杂的自定义按钮
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 我想要有条件的登录导航,没有 MAIN 片段或按钮

    我正在使用 Android Jetpack 导航组件 实时数据和 Firebase 我希望工作流程就像用户打开应用程序时一样 然后根据登录 注销状态导航到登录 配置文件片段 而不需要任何主片段或按钮 请 我的应用程序中没有主要片段 用户启动
  • 带有不透明导航栏的深色文本透明状态栏

    等等 这不是重复的 类似的问题已被问到here https stackoverflow com questions 38025865 android fully transparent status bar with non transpa
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我

随机推荐

  • 使用pyHook获取鼠标坐标以便稍后播放

    我正在编写一段代码来使用 pyHook 收集鼠标单击信息 然后使用 win32api 来访问单击函数 本质上 我试图使用鼠标来记录点击模式 以便稍后记录和回放 这是我现在的代码 import win32api win32con time w
  • 如何让网络工作者同时执行多项任务?

    我试图让 Web Worker 管理其状态 同时服务多个异步请求 工人 ts 文件 let a 0 this is my worker s state let worker self as unknown as Worker worker
  • 在 shell 中将星号转义为 Java 命令行参数

    我在 shell 中使用星号作为 Java 命令行参数时遇到了问题 我可以将这个问题的描述简化如下 首先 有一个简单的 java 程序 它打印命令行参数 public class CmdArgsTest public static void
  • C++ long 到 double 的可移植转换

    我需要准确地将长表示位转换为双精度 我的解决方案应可移植到不同的体系结构 能够跨编译器成为标准 如 g 和 clang 也很棒 我正在编写一个快速近似来计算 exp 函数 如建议的那样这个问题的答案 double fast exp doub
  • 使用jquery AJAX提交表单[重复]

    这个问题在这里已经有答案了 我正在尝试使用 jQuery ajax 提交表单 但我的数据没有发布到 PHP 它返回空数组 POST array 这是我的代码 这是我的表格
  • 参数嗅探

    假设我们有一个具有 6 个参数 性能不佳的存储过程 如果六个参数之一传输到存储过程中的局部变量 是否足以禁用参数嗅探 或者是否有必要将传递到存储过程的所有 6 个参数传输到存储过程中的局部变量 根据 Paul White 的评论 将变量分配
  • 如何在中国访问谷歌地图API

    我正在使用 google 地图 api 来获取我的 IBM Mobilefirst 项目中的用户位置 它在除中国之外的所有国家 地区都按预期工作正常 我知道这是因为中国已阻止在其国家 地区访问 google api 是否有任何解决方法我可以
  • 文本到语音转换

    我们正在制作 iPhone 应用程序 客户希望通过语音消息进行提醒 要求是用户设置他们想要提醒的时间和文字 使用文本 我将转换为语音并在触发提醒时播放音频文件 为此 我计划使用谷歌服务 播放这些文本并下载相同的音频文件 NSString u
  • Ruby on Rails - 是否可以通过 /app/assets/images 中的表单保存图像?

    我正在为一家销售二手车的小商店开发一个小型 Rub y on Rails 应用程序 该网站包含所有可用汽车的列表 包括汽车的图像 店内最多有20辆车 我读到 将图像直接保存在数据库中并不是最佳实践 最好使用 Amazon Web Servi
  • 字典格式的键错误“0”

    我仍然是 Python 的初学者 我想知道为什么会这样 dict dict 0 123 a 0 if dict format a format a 1 print True 给我一个关键错误 0 但不是这个 dict dict 0 123
  • 谷歌地图在每个外部链接位置显示多个标记点击而不刷新页面

    我想显示 Google 地图以固定每个位置的多个商店 例如 位置是 Chennai Trichy 班加罗尔 海得拉巴 如果我单击链接钦奈 地图将仅显示钦奈的多个商店 如果我点击 Trichy 链接 地图将仅在 Trichy 中显示多个商店
  • 使用 Outlook 日历 REST API 设置活动组织者

    我正在使用 Outlook REST API 创建事件并发送邀请 基于this文档 我对登录用户进行身份验证 并通过请求的授权标头及其内容上的 json 格式事件发送其承载令牌 如果我将 组织者 设置为另一用户而不是经过身份验证的用户 并将
  • 退出时如何保存 Activity 的状态?安卓

    我有一个基本的应用程序 其中包含文本输入 旋转器输入和第二个旋转器输入 其数组取决于 选项 菜单中更改的设置 目前 当我在应用程序中按 Home 或按 Return 时 我要么返回桌面 要么循环返回最近输入的旧输入 如何防止我的应用程序打开
  • ascx 用户控件中的事件处理

    从用户控件到父控件 页面通信事件的最佳实践是什么我想做类似的事情 MyPage aspx
  • Cordova 插件仅在 iOS 中第二次打开时有效,并出现线程警告。如何让插件初始化 onload?

    我的 iOS 应用程序中的 Cordova 插件仅在您打开应用程序 返回主屏幕将其关闭 然后重新打开应用程序后才起作用 然后 XCode 日志中会显示一条线程警告 2014 05 14 14 00 38 062 TLEMobile 2881
  • EF 4.1 RC:奇怪的级联删除

    我不得不承认 EF 4 1 RC Codefirst DataAnnotations 和 FluentAPI 的功能仍然让我难以抗拒 有时我真的不知道自己在做什么 请参阅以下 POCO public class Country Key pu
  • 当函数运行时写入 easygui 文本框?

    我目前正在使用 easygui 运行脚本来接收用户输入 在命令行中运行的旧脚本只会在命令行中打印用户需要知道的任何内容 但我已将其更改为在需要输入时在新的 easygui 框中输出通知 我想要做的是获得进度 正在运行的函数内的每个操作在完成
  • Next js 嵌套动态路由:通过 getstaticprops 获取数据,并在路由之间共享数据

    我正在尝试构建一个带有嵌套动态路由和路由之间共享数据的 next js 应用程序 文件结构如下所示 pages level1 level1 id js index js level2 level2 id js index js Level2
  • 值更改时不调用 ngOnChange

    我已经设置了plunk 我正在单击按钮和单击时更改对象的 bool 属性ngOnchange应该触发但没有发生 为什么 是否与父组件和子组件之间共享相同的对象引用有关 角度变化检测仅检查对象身份 如果修改对象的内容 Angular 将无法识
  • UWP xaml波纹效果(android效果)动画

    我尝试在 UWP 应用程序中编写 Android 效果 波纹 因此 我在网格内创建了一个 EllipseGeometry 在我的用户控件中 但是当我的 ellipseGeometry 的 RadiusX 和 RadiusY 播放动画时 我的