某些新闻:小米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超圆角的实现的更多相关文章

  1. WPF 创建无边框的圆角窗口

    原文:WPF 创建无边框的圆角窗口 如题所述,在WPF中要创建一个没有边框且为圆角的窗体,有如下几步工作要进行: 第一步:去掉窗体默认样式的边框 首先将窗体的背景设为透明,将允许透明的属性设置为Tru ...

  2. WPF——Sharder实现Logo走光动画

    利用WPF的走光动画实现的走光动画. 资源  实例程序 示例代码 LogoEffect logoEffect = }; //要添加走光动画的物体 logo.Effect = logoEffect; D ...

  3. 仿小米logo案例

    效果:做一个具有logo能过渡切换效果,类似于小米网站的logo 思路:将两个用于切换的logo以文字形式嵌入活动块banner的左右半,活动块banner的上级是主展示块box,初态只展示右半log ...

  4. WPF图片,DataGrid等实现圆角

    <Grid HorizontalAlignment="Center" VerticalAlignment="Center"> <Grid.Ro ...

  5. wpf中把按钮变成圆角

      <Button x:Name="btn" Content="改变" Width="100" Height="50&quo ...

  6. 【WPF】Bitmap Effect制作圆角加渲染TextBox

    <Window.Resources> <ControlTemplate x:Key="txtTemplate" TargetType="{x:Type ...

  7. css画小米、遨游logo

    狠简单的2个Logo,用纯css写出来,觉得挺好玩的. <!DOCTYPE html> <html> <head> <meta charset="u ...

  8. 《Programming WPF》翻译 第7章 1.图形基础

    原文:<Programming WPF>翻译 第7章 1.图形基础 WPF使得在你的应用程序中使用图形很容易,以及更容易开发你的显卡的能力.这有很多图形构架的方面来达到这个目标.其中最重要 ...

  9. 【炫丽】从0开始做一个WPF+Blazor对话小程序

    大家好,我是沙漠尽头的狼. .NET是免费,跨平台,开源,用于构建所有应用的开发人员平台. 本文演示如何在WPF中使用Blazor开发漂亮的UI,为客户端开发注入新活力. 注 要使WPF支持Blazo ...

随机推荐

  1. oracle impdp ORA-02304 invalid object identifier literal

    reference: https://webgeest.blogspot.com/2015/07/ora-39083-ora-02304-on-impdp-datapump.html     解决方法 ...

  2. 生产者与消费者以及ActiveMQ

    生产者与消费者以及ActiveMQ 一. 多线程实现生产者与消费者 1.1 生产者与消费者头文件 #pragma once #include <iostream> #include < ...

  3. 使用Prometheus搞定微服务监控

    最近对服务进行监控,而当前监控最流行的数据库就是 Prometheus,同时 go-zero 默认接入也是这款数据库.今天就对 go-zero 是如何接入 Prometheus ,以及开发者如何自己定 ...

  4. SOLID架构设计原则

    最近通读了<架构整洁之道>,受益匪浅,遂摘选出设计原则部分,与大家分享,希望大家能从中获益. 以下为书中第3部分 设计原则的原文. 设计原则概述 通常来说,要想构建-个好的软件系统,应该从 ...

  5. 剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树

    剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ...

  6. EF Core中通过Fluent API完成对表的配置

    EF Core中通过Fluent API完成对表的配置 设置实体在数据库中的表名 通过ToTable可以为数据模型在数据库中自定义表名,如果不配置,则表名为模型名的复数形式 public class ...

  7. JVM线上问题排查

    前言 本文介绍服务器内运行的 Java 应用产生的 OOM 问题 和 CPU 100% 的问题定位 1. 内存 OOM 问题定位 某Java服务(比如进程id pid 为 3320)出现OOM,常见的 ...

  8. FreeBSD 乃至开源界中的孔乙己 再论苦难哲学之一

    在许多狂热的FreeBSD 粉丝里,他们甚至不允许别人把FreeBSD写作freebsd,要和你强调,F和BSD都是大写的.还说这是什么尊重之类的东西.大抵和孔乙己的茴香豆的茴的有四种写法一样吧:&q ...

  9. Sentinel高级

    Sentinel高级 sentinel和springCloud整合 减少开发的复杂度,对大部分的主流框架,例如:Web Servlet.Dubbo.Spring Cloud.gRPC.Spring W ...

  10. android分析之mutex

    Android的锁是对Linux锁的一种包装: // ------------------------------------------------------------------------- ...