某些新闻:小米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. Python分类模型构建

    分离训练集测试集 from sklearn.model_selection import train_test_split eg: X_train, X_test, y_train, y_test = ...

  2. 高级FTP

      一.作业需求 1. 用户加密认证(已完成) 2. 多用户同时登陆(已完成) 3. 每个用户有自己的家目录且只能访问自己的家目录(已完成) 4. 对用户进行磁盘配额.不同用户配额可不同(已完成) 5 ...

  3. SpringBoot(十):SpringBoot的简单事务管理

    SpringBoot集成Mybatis之后,进行事务管理.SpringBoot使用事务非常简单,底层依然采用的是Spring本身提供的事务. 1.在入口类中使用注解@EnableTransaction ...

  4. 一个基于 Vue3 的开源项目,3个月时间 star 终于破千!

    本文主要是对如何做开源项目的一些思考. 前文回顾: <Vue3 来了,Vue3 开源商城项目重构计划正式启动!> <一个基于 Vue 3 + Vant 3 的开源商城项目> 关 ...

  5. Python爬虫系统化学习(4)

    Python爬虫系统化学习(4) 在之前的学习过程中,我们学习了如何爬取页面,对页面进行解析并且提取我们需要的数据. 在通过解析得到我们想要的数据后,最重要的步骤就是保存数据. 一般的数据存储方式有两 ...

  6. 上百本电子书(Java/Hadoop/Spark/Linux/机器学习/)免费分享 百度云持续更新

    分享一下自己整理的超多电子书, 其中包括:Java,Hadoop,Spark,Linux,Hbase,Hive,机器学习,区块链 目录如下: 1 Java 基础 2 Java 虚拟机 3 Java 并 ...

  7. kubernets资源预留

    一.  Kubelet Node Allocatable Kubelet Node Allocatable用来为Kube组件和System进程预留资源,从而保证当节点出现满负荷时也能保证Kube和Sy ...

  8. 测试平台系列(1) 搭建Flask服务

    搭建Flask服务 项目地址 点我进入项目地址 代码都会在这里有所展示,喜欢的话可以帮点个star,谢谢大家了!如果你喜欢该教程,也可以分享给其他人. 关于选型 想了很久,本来打算用「Gin」做为后端 ...

  9. redis一句话木马控电脑

      (1)在redis管理工具内写入木马并保存: 输入命令行: config set dbfilename shell.php set shell "<?php @assert($_P ...

  10. T1215拯救公主

    1 #include <cstdio> 2 #include <queue> 3 #include <set> 4 #include <cstring> ...