android 五角星坐标,GitHub - Mingyueyixi/StarView: 安卓星星视图,支持三角星、四角星、五角星到任意多个角(Angular) 的星星View。...

本文主要是介绍android 五角星坐标,GitHub - Mingyueyixi/StarView: 安卓星星视图,支持三角星、四角星、五角星到任意多个角(Angular) 的星星View。...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

StarView

简述:关于星星的View,满足你对所有个角的星星的幻想。

描述

项目包括StarView,StarDrawable,PathStarView。

StarView由普通图片绘制而成。

StaDrawable是一个Drawable类。支持任意多个角(Angular)。

PathStarView 支持任意多个角(Angular) 的星星View。

[注]

为支持任意多个角度的星星,经过了一系列复杂的数学运算,这将在文末有说明。

预览

它们的效果如下。

c0f0ba1f12fd1de70e47b3148050b88b.png

StarView

e027ae67735e50b0d6138b99115ad381.png

StarDrawable

74c7c533327688e4d0e716ae0955217d.png

PathStarView

ef8737aeb5eac0073aa7e4cae7516e37.png

PathStarView -- depth参数

984aa103ee9613070942e6a17a28d82e.png

PathStarView -- rotate参数

55b6eb17564cc81d768a27995fb02a97.png

PathStarView -- size参数

7ce0098da8bf7fa6294fa634b1b4a236.png

PathStarView -- horm参数

fbaf29660725230fa3c7f67c6955d12e.png

PathStarView -- 综合效果

相关算法说明

正多角星

多角星星在计算时,通过圆内接正多边形减去特定弧度的三角形而成,因此,这样的星星被我称为正多角星。

至于非正多角星。因为可以随手画出,不能归纳为数学函数。因此,不做研究。

涉及公式

涉及最多的是圆的函数公式,衍生的公式(弧的计算,三角函数等),以及勾股定理。

推导图

Android的屏幕坐标与常规坐标不同,其Y轴完全相反,在计算上会带来一定的困惑性。

下面是我计算正多角星的图解:

mind_picture.png

我们需要将正多角星星的每一个顶点坐标计算出来。

并且,我们需要推导出一个公用的坐标公式,这个坐标公式能够表示任意一个正多角星的顶点坐标。

代码实现

在实现过程中,我曾经通过计算出弧或三角形rpf的面积,接着通过Android的图片模式(Xfermode混合模式),循环一周,旋转固定角度相减而得到正多边形。这么做理论上行的通,实际效果则会导致存在1像素的空白线条间隙。所以,最后采用的办法是计算出所有坐标。

核心代码实现:

public class StarPathUtil {

/**

* 连接路径

*/

public static Path linePath(double r,int hormCount,@FloatRange(from=0,to =1) float depth){

Path starPath = new Path();

double sOrs = Math.PI * (90 - 180.0 / hormCount) / 180;//角arf的弧度

double sPro = (1.0 - depth) * sOrs;//角pra的弧度

double sPrs = depth*sOrs;//角prs的弧度

//圆内接正多边形边长公式2r*sin(180/n);rs = 边长/2

double lRs = r * Math.sin(Math.PI / hormCount);

double pr = lRs/Math.cos(sPrs);

//p点坐标

double pX = pr * Math.sin(sPro);

double pY = pr * Math.cos(sPro);

starPath.moveTo(0,0);

/**

* 已知圆心o(a,b),R(x,y),求R点顺时针移动c弧度后的坐标

* x'=(x-a)cos(-c)-(y-b)sin(-c)+a

* y'=(y-b)cos(-c)+(x-a)sin(-c)+b

*

* 此处坐标非正常坐标,为逆时针旋转,a=0,b=r,故:

* x' = x*cos(c) - (y-r)sin(c)

* y' = (y-r)cos(c) + x*sin(c)+r

*/

//循环求出每旋转c==PI*(360/hormCount)/180弧度后r点和p点的坐标,并构建为路径

for (int i = 0;i

double c = i*2*Math.PI/hormCount;

double sin_c = Math.sin(c);

double cos_c = Math.cos(c);

//r(0,0)>>R(x,y)

float rX2 = (float) (r*sin_c);

float rY2 = (float) (-r*cos_c + r);

//p(pX,pY)>>R(x,y)

float pX2 = (float) (pX*cos_c - (pY - r)*sin_c);

float pY2 = (float) ((pY - r)*cos_c + pX*sin_c +r);

starPath.lineTo(rX2,rY2);

starPath.lineTo(pX2,pY2);

Log.e("测试","r("+rX2+","+rY2+") , p("+pX2+","+pY2+")");

}

starPath.close();

Matrix m = new Matrix();

//旋转角度

// m.setRotate(rotate);

//计算时坐标系平移(r,0),现路径整体平移过去,以符合坐标系。

m.setTranslate((float) r,0);

starPath.transform(m);

return starPath;

}

}

其他

这个计算可能存在其他方式,期待能看到其他的算法实现。

项目仅仅能跑而已,代码结构等还有待改进。

这篇关于android 五角星坐标,GitHub - Mingyueyixi/StarView: 安卓星星视图,支持三角星、四角星、五角星到任意多个角(Angular) 的星星View。...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/493084

相关文章

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

css渐变色背景|<gradient示例详解

《css渐变色背景|<gradient示例详解》CSS渐变是一种从一种颜色平滑过渡到另一种颜色的效果,可以作为元素的背景,它包括线性渐变、径向渐变和锥形渐变,本文介绍css渐变色背景|<gradien... 使用渐变色作为背景可以直接将渐China编程变色用作元素的背景,可以看做是一种特殊的背景图片。(是作为背

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element