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

点击这里

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

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

 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. [AIR] 使用操作系统默认应用程序打开文件

    AIR 2.0及以上提供了非常简单易用的API让你使用操作系统所定义的关联应用程序打开文件. 这使得使用AIR开发基于“文件管理器”的应用称为可能 用法如下: var file:File = File ...

  2. expect--脚本实现免交互命令

    转自:http://blog.51cto.com/lizhenliang/1607723 注意:使用expect脚本时,需要把脚本添加执行权限,然后./test.sh直接执行,不能用sh或者sourc ...

  3. scrapy连接MySQL

    Scrapy中连接MySQL所需要做的工作如下: 1.settings中需要设置的部分 # 启动管道组件 ITEM_PIPELINES = { 'QianChengWuYu.mongoDBPiplel ...

  4. ajax跨域请求问题

    ajax是不允许跨域请求的,今天在使用bootstap-table的时候,data-url使用的地址是绝对地址,而非相对地址,因此在载入数据的时候就出错了. 启动的时候使用是 http://127.0 ...

  5. windows 安装python问题总结

    一.安装支持包 很多二进制包 NumPy-1.9+MKL 以及 Microsoft Visual C++ 2008 (x64, x86, and SP1 for CPython 2.6 and 2.7 ...

  6. todocmvc的安装

    安装依赖 官网 安装依赖的css,js $npm install 引入vue <script src="js/vue.js"></script> 定义初始化 ...

  7. Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)

    Problem  Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 1000 mSec Problem Descripti ...

  8. oracle nvl()函数

    oracle的nvl()函数作用是当第一个值不为null时,返回第一个值,否则返回第二个值. 当第一个值为一个运算表达式时,那么第二个的值被限定为只能是NUMBER类型或者能隐式转换为NUMBER类型 ...

  9. docker 容器container运行后,如何进入容器内部?

    docker exec -ti  容器ID  /bin/bash

  10. 【算法笔记】B1017 A除以B

    1017 A除以B (20 分)   本题要求计算 A/B ,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立. 输入格式: ...