WPF之小米Logo超圆角的实现
某些新闻:小米logo换新,程序员一行代码(border-radius:19px)实现,目前此行代码价值200万
某程序员内心:所以还是因为我代码写太少了,所以这200万才没有我的份吗?
这事儿也成功的引起了本羊的注意,花点时间,咱也用WPF来实现一下,到底这超圆角有多好看?
先上效果图:
经过一番了解,其实本质也就一条数学函数:|x|^n+|y|^n=1,上代码:
1 public class UIElementHelper
2 {
3 public static double GetSuperCornerRadius(FrameworkElement obj)
4 {
5 return (double)obj.GetValue(SuperCornerRadiusProperty);
6 }
7
8 public static void SetSuperCornerRadius(FrameworkElement obj, double value)
9 {
10 obj.SetValue(SuperCornerRadiusProperty, value);
11 }
12
13 public static readonly DependencyProperty SuperCornerRadiusProperty =
14 DependencyProperty.RegisterAttached("SuperCornerRadius", typeof(double), typeof(UIElementHelper), new PropertyMetadata(0.0, new PropertyChangedCallback((s, e) =>
15 {
16 var n = (double)e.NewValue;
17 var el = s as FrameworkElement;
18 if (n == 0)
19 {
20 el.Clip = null;
21 }
22 else
23 {
24 UpdateClip(el);
25 if (!el.IsLoaded)
26 {
27 el.SizeChanged += OnSizeChanged;
28 }
29 }
30 })));
31
32 private static void OnSizeChanged(object sender, SizeChangedEventArgs e)
33 {
34 UpdateClip(sender as FrameworkElement, false);
35 }
36
37 private static void UpdateClip(FrameworkElement el, bool updatePoints = true)
38 {
39 if (!updatePoints && el.Clip is StreamGeometry clip && !clip.IsFrozen)
40 {
41 //
42 }
43 else
44 {
45 clip = new StreamGeometry();
46 var points = GetSuperCornerRadiusPoints(GetSuperCornerRadius(el));
47 using(var context = clip.Open())
48 {
49 context.BeginFigure(points[0], true, true);
50 context.PolyBezierTo(points, true, true);//根据坐标点画贝塞尔曲线
51 }
52 points.Clear();
53 el.Clip = clip;//元素的剪切路径
54 }
55 var group = new TransformGroup();
56 group.Children.Add(new TranslateTransform(1, 1));//WPF以左上角为坐标原点,所以这里进行位移
57 var w = el.RenderSize.Width / 2;
58 group.Children.Add(new ScaleTransform(w, w));//放大
59 clip.Transform = group;
60 }
61
62 /// <summary>
63 /// 计算超圆角路径的坐标点
64 /// </summary>
65 /// <param name="n"></param>
66 /// <returns></returns>
67 public static List<Point> GetSuperCornerRadiusPoints(double n = 3)
68 {
69 var points = new List<Point>();
70 //求出Y>0时坐标
71 for (double x = -1; x <= 1; x += 0.001)
72 {
73 var y = Math.Pow(1 - Math.Pow(Math.Abs(x), n), 1 / n);//公式:|x|^n+|y|^n=1
74 points.Add(new Point(x, Math.Round(y, 3)));//3位小数,精度应该足够了
75 }
76 //Y<0的坐标
77 var count = points.Count;
78 for (int i = 1; i < count + 1; i++)
79 {
80 var p = points[count - i];
81 points.Add(new Point(p.X, p.Y * -1));
82 }
83 return points;
84 }
85
86
87 }
工程文件,感兴趣的下载玩玩。
WPF之小米Logo超圆角的实现的更多相关文章
- WPF 创建无边框的圆角窗口
原文:WPF 创建无边框的圆角窗口 如题所述,在WPF中要创建一个没有边框且为圆角的窗体,有如下几步工作要进行: 第一步:去掉窗体默认样式的边框 首先将窗体的背景设为透明,将允许透明的属性设置为Tru ...
- WPF——Sharder实现Logo走光动画
利用WPF的走光动画实现的走光动画. 资源 实例程序 示例代码 LogoEffect logoEffect = }; //要添加走光动画的物体 logo.Effect = logoEffect; D ...
- 仿小米logo案例
效果:做一个具有logo能过渡切换效果,类似于小米网站的logo 思路:将两个用于切换的logo以文字形式嵌入活动块banner的左右半,活动块banner的上级是主展示块box,初态只展示右半log ...
- WPF图片,DataGrid等实现圆角
<Grid HorizontalAlignment="Center" VerticalAlignment="Center"> <Grid.Ro ...
- wpf中把按钮变成圆角
<Button x:Name="btn" Content="改变" Width="100" Height="50&quo ...
- 【WPF】Bitmap Effect制作圆角加渲染TextBox
<Window.Resources> <ControlTemplate x:Key="txtTemplate" TargetType="{x:Type ...
- css画小米、遨游logo
狠简单的2个Logo,用纯css写出来,觉得挺好玩的. <!DOCTYPE html> <html> <head> <meta charset="u ...
- 《Programming WPF》翻译 第7章 1.图形基础
原文:<Programming WPF>翻译 第7章 1.图形基础 WPF使得在你的应用程序中使用图形很容易,以及更容易开发你的显卡的能力.这有很多图形构架的方面来达到这个目标.其中最重要 ...
- 【炫丽】从0开始做一个WPF+Blazor对话小程序
大家好,我是沙漠尽头的狼. .NET是免费,跨平台,开源,用于构建所有应用的开发人员平台. 本文演示如何在WPF中使用Blazor开发漂亮的UI,为客户端开发注入新活力. 注 要使WPF支持Blazo ...
随机推荐
- 后端程序员之路 18、朴素贝叶斯模型(Naive Bayesian Model,NBM)
贝叶斯推断及其互联网应用(一):定理简介 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.ht ...
- Redis-第十章节-链表
目录 数组和链表 链表 对比 总结 1.数组和链表 数组: 数组会在内存中开辟一块连续的空间存储数据,这种存储方式有利也有弊端.当获取数据的时候,直接通过下标值就可以获取到对应的元素,时间复杂度为O( ...
- HDOJ-1686(KMP算法)
Oulipo HDOJ-1686 本题的思路就是KMP,和HDOJ-1711思路一样,不再赘述详情可以看链接:1711题解 #include<iostream> #include<c ...
- 大牛带你学会java类加载机制,不要错过,值得收藏!
很多人对java类加载机制都是非常抗拒的,因为这个太难理解了,但是我们作为一名优秀的java工程师,还是要把java类加载机制研究和学习明白的,因为这对于我们在以后的工作中有很大的帮助,因为它在jav ...
- Ubuntu更换python默认版本
设置python版本: 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 2 sudo ...
- web实现时钟效果
纯原生开发时钟效果,话不多说直接上代码. HTML标签部分 <div class="cricles"> <div class="poin ...
- 翻译:《实用的Python编程》05_02_Classes_encapsulation
目录 | 上一节 (5.1 再谈字典) | 下一节 (6 生成器) 5.2 类和封装 创建类时,通常会尝试将类的内部细节进行封装.本节介绍 Python 编程中有关封装的习惯用法(包括私有变量和私有属 ...
- Django之模版层
一.模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别,也就是说,HTML被直接硬编码在python代码之中. def current_datetime(request): now = ...
- PTA 有序数组的插入
6-5 有序数组的插入 (20 分) 本题要求将任一给定元素插入从大到小排好序的数组中合适的位置,以保持结果依然有序. 函数接口定义: bool Insert( List L, ElementTy ...
- 开源的 Switch 模拟器——GitHub 热点速览 v.21.12
作者:HelloGitHub-小鱼干 脸滚键盘操作选手小鱼干这里要推荐一个超酷 Switch 模拟器,不能埋没你的游戏天赋.Ryujinx 是一个 C# 写的 Switch 模拟器,1700+ 游戏可 ...