这个是参考大神的修改了一下渲染方式实现的,可以去查看原帖的,原贴是圆形头像,原理讲的非常详细

点击这里

我写的这个只支持正方形图片,效果是酱紫的~

一共三个代码,还需要两个代码,原帖里都有的,我只是修改了其中一个。

 using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Sprites; [AddComponentMenu("UI/Circle Image")]
public class CircleImage1 : BaseImage {
// Use this for initialization
void Awake () {
innerVertices = new List<Vector3>();
outterVertices = new List<Vector3>();
} // Update is called once per frame
void Update () { } [Range(, )]
public float scale = 1f; [Range(, )]
public int segements = ; private List<Vector3> innerVertices;
private List<Vector3> outterVertices; protected override void OnPopulateMesh(VertexHelper vh)
{ vh.Clear();
Rect pixelAdjustedRect = this.GetPixelAdjustedRect(); Vector4 uv = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;
//Debug.LogError("uv:" + uv+","+uv.w+","+uv.x+","+uv.y+","+uv.z); Vector2 u = new Vector2(, );
float w = pixelAdjustedRect.width; #region
//
for (int i =; i < segements+; i++)
{
UIVertex uivertex = new UIVertex();
uivertex.color = color;
if (i ==)
{
//半径*
uivertex.uv0 = new Vector2(uv.x + (scale / ) * (uv.z - uv.x) * ( - Mathf.Sin(i * / segements)), uv.y + (scale / ) * (uv.w - uv.y) * ( - Mathf.Cos(i * / segements)));
u = new Vector2((scale / ) * ( - Mathf.Sin(i * / segements)),(scale / ) * ( - Mathf.Cos(i * / segements)));
}
else
{
uivertex.uv0 = new Vector2(uv.x + (scale / ) * (uv.z - uv.x) * ( - Mathf.Sin(Mathf.PI / (180f / (i * / segements)))), uv.y + (scale / ) * (uv.w - uv.y) * ( - Mathf.Cos(Mathf.PI / (180f / (i * / segements)))));
u = new Vector2((scale / ) * ( - Mathf.Sin(Mathf.PI / (180f / (i * / segements)))),(scale / ) * ( - Mathf.Cos(Mathf.PI / (180f / (i * / segements)))));
}
uivertex.position = new Vector3(w * u.x - w / , w * u.y - w / ); vh.AddVert(uivertex);
}
//
for (int i = ; i < segements + ; i++)
{
UIVertex uivertex = new UIVertex();
uivertex.color = color;
if (i == )
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (scale / ) * ( - Mathf.Cos(i * / segements)), uv.y + (uv.w - uv.y) * (( - scale / ) + (scale / ) * Mathf.Sin(i * / segements)));
u = new Vector2((scale / ) - (scale / ) * Mathf.Cos(i * / segements), ( - scale / ) + (scale / ) * Mathf.Sin(i * / segements));
}
else
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (scale / ) * ( - Mathf.Cos(Mathf.PI / (180f / (i * / segements)))), uv.y + (uv.w - uv.y) * (( - scale / ) + (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements)))));
u = new Vector2( (scale / ) * ( - Mathf.Cos(Mathf.PI / (180f / (i * / segements)))), ( - scale / ) + (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements))));
}
uivertex.position = new Vector3(w * u.x - w / , w * u.y - w / );
vh.AddVert(uivertex);
}
//
for (int i = ; i < segements + ; i++)
{
UIVertex uivertex = new UIVertex();
uivertex.color = color;
if (i == )
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (( - scale / ) + (scale / ) * Mathf.Sin(i * / segements)), uv.y + (uv.w - uv.y) * (( - scale / ) + (scale / ) * Mathf.Cos(i * / segements)));
u = new Vector2(( - scale / ) + (scale / ) * Mathf.Sin(i * / segements), ( - scale / ) + (scale / ) * Mathf.Cos(i * / segements));
}
else
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (( - scale / ) + (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements)))), uv.y + (uv.w - uv.y) * (( - scale / ) + (scale / ) * Mathf.Cos(Mathf.PI / (180f / (i * / segements)))));
u= new Vector2(( - scale / ) + (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements))), ( - scale / ) + (scale / ) * Mathf.Cos(Mathf.PI / (180f / (i * / segements))));
}
uivertex.position = new Vector3(w * u.x - w / , w * u.y - w / );
vh.AddVert(uivertex);
}
//
for (int i = ; i < segements + ; i++)
{
UIVertex uivertex = new UIVertex();
uivertex.color = color;
if (i == )
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (( - scale / ) + (scale / ) * Mathf.Cos(i * / segements)), uv.y + (uv.w - uv.y) * ((scale / ) - (scale / ) * Mathf.Sin(i * / segements)));
u = new Vector2(( - scale / ) + (scale / ) * Mathf.Cos(i * / segements), (scale / ) - (scale / ) * Mathf.Sin(i * / segements));
}
else
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (( - scale / ) + (scale / ) * Mathf.Cos(Mathf.PI / (180f / (i * / segements)))), uv.y + (uv.w - uv.y) * ((scale / ) - (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements)))));
u = new Vector2(( - scale / ) + (scale / ) * Mathf.Cos(Mathf.PI / (180f / (i * / segements))), (scale / ) - (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements))));
}
uivertex.position = new Vector3(w * u.x - w / , w * u.y - w / );
vh.AddVert(uivertex);
} //((点*4+8个点-3)条弦+1)个三角形
for (int i = ; i < ((segements - ) * + - + ); i++)
{
vh.AddTriangle(, i + , i + );
}
#endregion
} public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
{
// Sprite sprite = overrideSprite;
// if (sprite == null)
// return true; // Debug.LogError("鼠标点击:" + screenPoint); // Vector2 local;
// RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPoint, eventCamera, out local);
return true;
} private bool Contains(Vector2 p, List<Vector3> outterVertices, List<Vector3> innerVertices)
{
var crossNumber = ;
RayCrossing(p, innerVertices, ref crossNumber);//检测内环
RayCrossing(p, outterVertices, ref crossNumber);//检测外环
return (crossNumber & ) == ;
} /// <summary>
/// 使用RayCrossing算法判断点击点是否在封闭多边形里
/// </summary>
/// <param name="p"></param>
/// <param name="vertices"></param>
/// <param name="crossNumber"></param>
private void RayCrossing(Vector2 p, List<Vector3> vertices, ref int crossNumber)
{
for (int i = , count = vertices.Count; i < count; i++)
{
var v1 = vertices[i];
var v2 = vertices[(i + ) % count]; //点击点水平线必须与两顶点线段相交
if (((v1.y <= p.y) && (v2.y > p.y))
|| ((v1.y > p.y) && (v2.y <= p.y)))
{
//只考虑点击点右侧方向,点击点水平线与线段相交,且交点x > 点击点x,则crossNumber+1
if (p.x < v1.x + (p.y - v1.y) / (v2.y - v1.y) * (v2.x - v1.x))
{
crossNumber += ;
}
}
}
} }

ugui之圆角矩形头像实现的更多相关文章

  1. 用贝赛尔曲线把图片, 按钮, label 绘成圆 或圆角矩形

    //创建圆形遮罩,把用户头像变成圆形 /* *CGPointMake(35, 35)  是绘图的中心点,  如果想把控件居中绘圆, 一般用控件的中心点,   radius 是圆半径   startAn ...

  2. swift UIImage加载远程图片和圆角矩形

    UIImage这个对象是swift中的图像类,可以使用UIImageView加载显示到View上. 以下是UIImage的构造函数: init(named name: String!) -> U ...

  3. Android圆角矩形创建工具RoundRect类

    用于把普通图片转换为圆角图像的工具类RoundRect类(复制即可使用): import android.content.Context; import android.graphics.Bitmap ...

  4. canvas文字自动换行、圆角矩形画法、生成图片手机长按保存、方形图片变圆形

    canvas的文字自动换行函数封装 // str:要绘制的字符串 // canvas:canvas对象 // initX:绘制字符串起始x坐标 // initY:绘制字符串起始y坐标 // lineH ...

  5. IOS 设置圆角用户头像

    在App中有一个常见的功能,从系统相册或者打开照相机得到一张图片,然后作为用户的头像.从相册中选取的图片明明都是矩形的图片,但是展示到界面上却变成圆形图片,这个神奇的效果是如何实现的呢? 请大家跟着下 ...

  6. [BOT] 一种android中实现“圆角矩形”的方法

    内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...

  7. RoundedImageView,实现圆形、圆角矩形的注意事项

    RoundedImageView是gitHub上面的一个开源组件(https://github.com/vinc3m1/RoundedImageView),实现一些圆形或者圆角矩形是很方便的, < ...

  8. iOS设置圆角矩形和阴影效果

    1.设置圆角矩形 //设置dropview属性 _dropView.backgroundColor=[[UIColor whiteColor] colorWithAlphaComponent:0.8] ...

  9. 如何在html中做圆角矩形和 只有右边的"分隔线"

    这个网站满好的,可以常看看 css-matic中有几个很好的写css可视化的工具 其实做css 版式布局等都可以有工具的 推荐40个优秀的免费CSS工具 debugger正则表达式在线 其实是对(理论 ...

随机推荐

  1. iBatis --> MyBatis

    从 Clinton Begin 到 Google(从 iBatis 到 MyBatis,从 Apache Software Foundation 到 Google Code),Apache 开源代码项 ...

  2. python之类与对象(2)

    3. 类函数的进阶 3.1 类函数调用类属性 关于类函数调用类属性,我们尝试修改前一节的内容,以我们在之前学习的内容,调用属性直接用%+属性就可以了,那我们来试一下: 看到了程序有报错,这其实是因为在 ...

  3. [BZOJ 5074][Lydsy1710月赛]小B的数字

    传送门 \(\color{green}{solution}\) 设 \[b_{i}=2^{w_{i}},sum= \sum_{i=1}^{n}{w_{i}}\] 则对于任意\(a_{i}\)都有 \[ ...

  4. docker 查看容器信息---格式化

    镜像,ID,端口号,状态 docker ps -a --format "table {{.Image}}\t{{.ID}}\t{{.Ports}}\t{{.Status}}" 列出 ...

  5. sqlserver 并发机制

    一.事务四大属性 分别是原子性.一致性.隔离性.持久性. 1.原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库, ...

  6. C/C++中创建(带头结点、不带头结点的)单链表

    1.带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法) 了解单链表中节点的构成 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义: /* 定义链表 */ ...

  7. mysql 03

    CREATE TABLE class(    empno INT,    ename VARCHAR(4),    job VARCHAR(4),    mgr INT,    hiredate DA ...

  8. webstorm-主题和配色

    webstorm-主题和配色 2016年01月31日 19:40:54 walkersc 阅读数:73670更多 个人分类: javascript   URL:http://blog.csdn.net ...

  9. java实现猴子选大王问题(约瑟夫问题)

    题目:m只猴子围成一圈报数,报n的猴子自动离开,然后下一位重新从1开始报数,一直循环,最后剩下的那个猴子就是猴大王,写出程序求出最后是大王的那只猴子最初的位置. package learn; impo ...

  10. Win7/Vista/Server2008下VS 环境 调试调用 HTTP.SYS 无法启动监听服务及启动后其他机器无法访问端口

    一. VS调试在Win7(vista系列)操作系统下 HttpListener无法绑定多个 指定IP.端口问题 来自:http://www.cnblogs.com/ryhan/p/4195693.ht ...