ugui之圆角矩形头像实现
这个是参考大神的修改了一下渲染方式实现的,可以去查看原帖的,原贴是圆形头像,原理讲的非常详细
我写的这个只支持正方形图片,效果是酱紫的~
一共三个代码,还需要两个代码,原帖里都有的,我只是修改了其中一个。


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之圆角矩形头像实现的更多相关文章
- 用贝赛尔曲线把图片, 按钮, label 绘成圆 或圆角矩形
//创建圆形遮罩,把用户头像变成圆形 /* *CGPointMake(35, 35) 是绘图的中心点, 如果想把控件居中绘圆, 一般用控件的中心点, radius 是圆半径 startAn ...
- swift UIImage加载远程图片和圆角矩形
UIImage这个对象是swift中的图像类,可以使用UIImageView加载显示到View上. 以下是UIImage的构造函数: init(named name: String!) -> U ...
- Android圆角矩形创建工具RoundRect类
用于把普通图片转换为圆角图像的工具类RoundRect类(复制即可使用): import android.content.Context; import android.graphics.Bitmap ...
- canvas文字自动换行、圆角矩形画法、生成图片手机长按保存、方形图片变圆形
canvas的文字自动换行函数封装 // str:要绘制的字符串 // canvas:canvas对象 // initX:绘制字符串起始x坐标 // initY:绘制字符串起始y坐标 // lineH ...
- IOS 设置圆角用户头像
在App中有一个常见的功能,从系统相册或者打开照相机得到一张图片,然后作为用户的头像.从相册中选取的图片明明都是矩形的图片,但是展示到界面上却变成圆形图片,这个神奇的效果是如何实现的呢? 请大家跟着下 ...
- [BOT] 一种android中实现“圆角矩形”的方法
内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...
- RoundedImageView,实现圆形、圆角矩形的注意事项
RoundedImageView是gitHub上面的一个开源组件(https://github.com/vinc3m1/RoundedImageView),实现一些圆形或者圆角矩形是很方便的, < ...
- iOS设置圆角矩形和阴影效果
1.设置圆角矩形 //设置dropview属性 _dropView.backgroundColor=[[UIColor whiteColor] colorWithAlphaComponent:0.8] ...
- 如何在html中做圆角矩形和 只有右边的"分隔线"
这个网站满好的,可以常看看 css-matic中有几个很好的写css可视化的工具 其实做css 版式布局等都可以有工具的 推荐40个优秀的免费CSS工具 debugger正则表达式在线 其实是对(理论 ...
随机推荐
- jquery源码解析:proxy,access,swap,isArraylike详解
jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的. jQuery.extend({ ...... guid: 1, //唯一标识符 ...
- UIView中的tintColor和renderingMode
tintColor 每一个view都有一个tintcolor,类似于魔法色,实现类似于换肤的效果. 每一个view的subview都集成view的tintcolor,当然subview可以指定自己的t ...
- 二叉搜索树 思想 JAVA实现
二叉搜索树:一棵二叉搜索树是以一棵二叉树来组织的,这样一棵树可以使用链表的数据结构来表示(也可以采用数组来实现).除了key和可能带有的其他数据外,每个节点还包含Left,Right,Parent,它 ...
- MySQL压缩版Windows环境进行安装配置
MySQL下载地址:https://dev.mysql.com/downloads/mysql/ 选择对应的系统和相应的版本后点击Download进入下载页面,不需要登录,点击下面的“No thank ...
- WinForm的Chart图形控件
/// <summary>画条形图的方法 /// </summary> /// <param name="arr">条形值数组参数</pa ...
- svn: Failed to run the WC DB work queue associated svn的bug解决
第一步,下载sqlite 官方网址 :https://www.sqlite.org/download.html 第二步:解压放在c盘 第三步:配置环境变量 第四步:找到工作空间的.svn文件,cmd ...
- Oracle 删除监听程服务
1.开始->运行->输入regidit ->->->->->红框内的右键删除 2.开始->运行->输入regidit ->->-> ...
- HTML基础笔记
html基础 (1)什么是html?超文本标记语言 用于开发网页的语言,由浏览器解释执行 (2)html文件的基本结构 <html> <head> <title>& ...
- Zookeeper概念学习系列之zab协议
不多说,直接上干货! 上一章讨论了paxos算法,把paxos推到一个很高的位置. Zookeeper概念学习系列之paxos协议 但是,paxos有没有什么问题呢?实际上,paxos还是有其自身的缺 ...
- 【ExtJS】FormPanel 布局(二)
周末2天好好学习了下布局,现在都给实现了吧. 5.border布局: Border布局将容器分为五个区域:north.south.east.west和center.除了center区域外,其他区域都需 ...