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 ...
随机推荐
- Java Socket编程基础及深入讲解
原文链接:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html 原文写的特别好,非常详细,但是禁止转载,那我就不再复制粘贴了! socket实现 ...
- vue关于导航守卫的几种应用场景
beforeEach 该钩子函数主要用来做权限的管理认证 router.beforeEach((to, from, next) => { if (to.matched.some(record = ...
- jmeter数据库链接配置
通常使用数据库有3个要求,性能好.数据一致性有保障.数据安全可靠:数据库优化的前提也是这三个要求.有句玩笑话叫少做少犯错,不做不犯错.DB优化的思路就是少做,减少请求次数,减少数据传输量,减少运算量. ...
- Codeforces 598D (ccpc-wannafly camp day1) Igor In the Museum
http://codeforces.com/problemset/problem/598/D 分析:BFS,同一连通区域的周长一样,但查询过多会导致TLE,所以要将连通区域的答案储存,下次查询到该连通 ...
- JDBC概要
JDBC基础应用 JDBC是Java连接数据库的一套接口,可以让我们方便的在Java中使用数据库.掌握JDBC的使用是Java开发的基本功. 预备工作 导入jar包.根据使用的数据库软件导入相应的ja ...
- 死磕Spring之IoC篇 - @Bean 等注解的实现原理
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- P3387 【模板】缩点 题解 (Tarjan)
题目链接 P3387 [模板]缩点 解题思路 这几天搞图论,好有趣hhh,多写几篇博客. 上次学\(Tarjan\)求割点,这次缩点. 思路大概是多一个栈和染色的步骤,每次\(Tarjan\)的时候把 ...
- SPOJ QTree【树链剖分】
一 题目 QTREE 二 分析 第一道树链剖分的题,写的好艰难啊. 题意还是比较好理解的,就是在树上操作. 对于修改,题中要求的是单点修改,就算是直接树上操作也是非常简单的. 对于查询,查询的时候,是 ...
- go语言实现数组去重
import ( "fmt" ) func main() { a := []int{2, 1, 2, 5, 6, 3, 4, 5, 2, 3, 9} z := Rm_duplica ...
- C# 获取网页信息
获取网页源码 ///通过HttpWebResponse public string GetUrlHtml(string url) { string strHtml = string.Empty; Ht ...