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 ...
随机推荐
- if __name__ == '__main__':简单粗暴解释
这个脚本被执行的时候,__name__ 值就是 __main__ ,才会执行 main()函数如果这个脚本是被 import 的话,__name__的值不一样.main()函数就不会被调用.这个句子用 ...
- Oracle VM VirtualBox下创建CentOS虚拟系统
下载镜像 创建虚拟电脑 点击新建,输入服务器命名(根据自己喜好),选择好类型和版本(我下载的是64位的CentOS系统,所以选择类型为Linux,版本为其他版本). 修改内存大小 系统建议为512M, ...
- POJ-2406(KMP+字符串压缩)
Power String POJ-2406 字符串压缩模板题,但是是求有多少个这样最短的子串可以组成s. #include<iostream> #include<cstring> ...
- JDBC概要
JDBC基础应用 JDBC是Java连接数据库的一套接口,可以让我们方便的在Java中使用数据库.掌握JDBC的使用是Java开发的基本功. 预备工作 导入jar包.根据使用的数据库软件导入相应的ja ...
- 简单的ssm练手联手项目
简单的ssm练手联手项目 这是一个简单的ssm整合项目 实现了汽车的品牌,价格,车型的添加 ,修改,删除,所有数据从数据库中拿取 使用到了jsp+mysql+Mybatis+spring+spring ...
- Go语言|类型转换和类型别名
类型转换 同类型之间的转换 Go语言中只有强制类型转换,没有隐式类型转换.该语法只能在两个类型之间支持相互转换的时候使用. import "fmt" func main() { v ...
- P1725 琪露诺 题解(单调队列)
题目链接 琪露诺 解题思路 单调队列优化的\(dp\). 状态转移方程:\(f[i]=max{f[i-l],f[i-l+1],...,f[i-r-1],f[i-r]}+a[i]\) 考虑单调队列优化. ...
- Django分页器组建
class Pagination(object): def __init__(self,current_page,all_count,per_page_num=2,pager_count=11): & ...
- Azure Cost alerts 费用成本分析
一,引言 依稀记得在一月初,我们在 Azure 上做成了一个 费用警报的监控,果不其然,前两天 Azure 给我发了两封封 Azure 预警警报的邮件,提醒我的预算的总费用超过了设置的通知阈值 &qu ...
- P1089_津津的储蓄计划(JAVA语言)
package 顺序与分支; /* * 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱, 津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄, ...