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

点击这里

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

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

 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. [ActionScript 3.0] AS3 ServerSocket示例(官方示例)

    下面的示例创建一个套接字服务器.要使用该服务器,可将套接字绑定到本地端口,然后从其他应用程序连接到该端口.该服务器仅识别 UTF-8 字符串. package { import flash.displ ...

  2. js 平均分割

    let alllist=res.data; var result = []; for (var i = 0; i < alllist.length; i += 3) { result.push( ...

  3. 基本bash shell命令

    以下列举一些常用的bash shell命令,在使用时方便查找. 访问Linux系统上的手册:man 命令.例:man ps      手册是由分页程序来显示的,可以通过点击 空格,回车,向上和向下箭头 ...

  4. 基于windows fiber的协程(coroutine)实现

    一个非常简单,但是实用的协程实现,使用Windows的*Fiber函数族(linux可以稍微改一下用*context函数族). fco.h #ifndef _MSC_VER #error " ...

  5. 读《3M 利率分析新框架》

    目录 读<3M 利率分析新框架> 前言 传统的利率研究框架 3M 利率研究新框架 Macro Monetary Macro Prudence 总结 参考文献 <3M 利率分析新框架& ...

  6. Python多继承解析顺序的C3线性算法流程解析

    Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和 ...

  7. PHP会话cookie类的封装

    <?php header('content-type:text/html;charset=utf-8');/** * 完成cookie的设置.删除.更新.读取 */class Cookie{   ...

  8. netsh命令操作防火墙

    这里的netsh命令操作防火墙主要是在Windows 7及以上版本,以示例说明: 1.防火墙入方向添加一条规则,规则名字:RDP,协议tcp,动作为允许,端口号3389:简而言之,就是允许其他机器远程 ...

  9. final学习

    类加载过程 1.装载:查找和导入Class文件 2.链接:其中解析步骤是可以选择的 (a)检查:检查载入的class文件数据的正确性 (b)准备:给类的静态变量分配存储空间 (c)解析:将符号引用转成 ...

  10. 面经问题总结——django相关

    1.让你从头设计一个web框架,第一步你会做什么? 2.django的orm是怎么实现的? 3.django的URL路径映射是怎么实现的? 4.平常你怎么运用django提供的钩子函数? 5.三级分销 ...