顶点数在<5时没有正多角星,顶点数>5时正多角星不唯一,本文只绘制最具代表性的一种

代码如下:

public class CanvasStar extends View{

public CanvasStar(Context context) {

super(context);

}

public CanvasStar(Context context, AttributeSet attrs) {

super(context, attrs);

}

public CanvasStar(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

public CanvasStar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {

super(context, attrs, defStyleAttr, defStyleRes);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

Paint paint=new Paint();

paint.setAntiAlias(true);

drawStar(canvas,paint,Color.RED,getHeight()/12,3,false);

canvas.translate(getHeight()/6,0);

drawStar(canvas,paint,Color.RED,getHeight()/12,3,true);

canvas.translate(-getHeight()/6,0);

canvas.translate(0,getHeight()/6);

drawStar(canvas,paint,Color.YELLOW,getHeight()/12,4,false);

canvas.translate(getHeight()/6,0);

drawStar(canvas,paint,Color.YELLOW,getHeight()/12,4,true);

canvas.translate(-getHeight()/6,0);

canvas.translate(0,getHeight()/6);

drawStar(canvas,paint,Color.GREEN,getHeight()/12,5,false);

canvas.translate(getHeight()/6,0);

drawStar(canvas,paint,Color.GREEN,getHeight()/12,5,true);

canvas.translate(-getHeight()/6,0);

canvas.translate(0,getHeight()/6);

drawStar(canvas,paint,Color.CYAN,getHeight()/12,6,false);

canvas.translate(getHeight()/6,0);

drawStar(canvas,paint,Color.CYAN,getHeight()/12,6,true);

canvas.translate(-getHeight()/6,0);

canvas.translate(0,getHeight()/6);

drawStar(canvas,paint,Color.BLUE,getHeight()/12,7,false);

canvas.translate(getHeight()/6,0);

drawStar(canvas,paint,Color.BLUE,getHeight()/12,7,true);

canvas.translate(-getHeight()/6,0);

canvas.translate(0,getHeight()/6);

drawStar(canvas,paint,Color.BLACK,getHeight()/12,8,false);

canvas.translate(getHeight()/6,0);

drawStar(canvas,paint,Color.BLACK,getHeight()/12,8,true);

canvas.translate(0,getHeight()/6);

}

/**

* 绘制彩色多边形或星形

* @param canvas Canvas画布

* @param paint Paint画笔

* @param color 颜色

* @param radius 外接圆半径

* @param count 外顶点数

* @param isStar 是否为星形

*/

private void drawStar(Canvas canvas, Paint paint, @ColorInt int color, float radius,int count,boolean isStar){

canvas.translate(radius,radius);

if ((!isStar) && count < 3){

canvas.translate(-radius,-radius);

return;

}

if (isStar && count < 5){

canvas.translate(-radius,-radius);

return;

}

canvas.rotate(-90);

if (paint == null){

paint = new Paint();

}else{

paint.reset();

}

Path path = new Path();

float inerRadius = count%2==0?

(radius*(cos(360/count/2)-sin(360/count/2)*sin(90-360/count)/cos(90-360/count)))

:(radius*sin(360/count/4)/sin(180-360/count/2-360/count/4));

for (int i=0;i

if (i==0){

path.moveTo(radius*cos(360/count*i),radius*sin(360/count*i));

}else{

path.lineTo(radius*cos(360/count*i),radius*sin(360/count*i));

}

if (isStar){

path.lineTo(inerRadius*cos(360/count*i+360/count/2),inerRadius*sin(360/count*i+360/count/2));

}

}

path.close();

paint.setColor(color);

canvas.drawPath(path,paint);

canvas.rotate(90);

canvas.translate(-radius,-radius);

}

/**

* Math.sin的参数为弧度,使用起来不方便,重新封装一个根据角度求sin的方法

* @param num 角度

* @return

*/

float sin(int num){

return (float) Math.sin(num*Math.PI/180);

}

/**

* 与sin同理

*/

float cos(int num){

return (float) Math.cos(num*Math.PI/180);

}

}

效果如下:

5角星画法 android,Android Canvas绘制正多边形和正多角星相关推荐

  1. android 用canvas 绘制简单圆形时钟

    写笔记写写不过人家 http://blog.csdn.net/u010575173/article/details/52701936 1,Android - Paint基础 在自定义控件时,经常需要使 ...

  2. android代码绘制正弦图像,利用Android的Canvas绘制正弦函数图像

    一时兴起用android原生的基础绘制工具,绘制了一个正弦(余弦)函数图象,不多说,先上图: MainView.java类 package com.zhaofeng.main; import java ...

  3. android之canvas绘制矩形

    需求:想实现使用canvas绘制矩形 实现如下: @SuppressLint("AppCompatCustomView") public class MyImageView ext ...

  4. android之Canvas绘制图片

    参考 https://blog.csdn.net/u013135085/article/details/81216663 需求:给与一张图片,可以设置大小,绘制出图片 步骤一:加载位图 normalF ...

  5. Android使用canvas绘制视力表E标

    展示视力表中带有方向的E标 返回drawable可以直接展示在view之上 /*** 使用canvas画出E标** @param direction* @return*/ public static ...

  6. Android里canvas绘制中文

    给定一条线,作为穿过文字中间的线,即文字处于该条线中间,居中,取名为center线: 计算 canvas.drawText方法里的y值具体公式:center + (paint.fontMetrics. ...

  7. Canvas学习:封装Canvas绘制基本图形API

    Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习 从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方法, ...

  8. canvas绘制星空(起手篇)

    无图不欢,先上图 <!DOCTYPE html> <html><head><meta name="keywords" content=&q ...

  9. 自绘动画android,(译)android利用Canvas和几何学绘制几何动画

    1 创建圆形动画 首先需要画一些同心圆,并添加动画将同心圆的半径逐渐增加,即从同心圆中心向四周扩散的动画. 需要定义一些属性包括:同心圆间隔.圆线颜色.圆线宽度: 1dp @color/black 1 ...

  10. android canvas 画按钮,Android 用Canvas轻松绘制一个时钟

    接下来这篇文章主要是结束如何轻松自定义一个View并使用Canvas绘制一个时钟的案例,话不多说先上图瞅瞅,一共实现了两种效果,一种是秒动(秒针一秒走一针).另一种是连动式的,秒针不会停会一直走动,话 ...

最新文章

  1. 连接linux系统软件,Windows系统上有哪些不错的终端软件可以远程连接Linux?
  2. 获取微软产品下载链接
  3. POJ - 3190 Stall Reservations(贪心+优先队列优化)
  4. JS 导出Excel,Word
  5. 使用foreach循环遍历Collection集合
  6. 如何应对内网安全的那些新挑战——威胁不断,防御不止
  7. java当前目录指什么_是什么决定了Tomcat Java进程的当前工作目录?
  8. 不再惧怕!二叉树结构相关算法总结 | 原力计划
  9. python世界你好_“你好,世界Python教程
  10. dsp c语言流水灯程序,DSP流水灯源程序
  11. oracle如何恢复被误误删除的pdb
  12. java word书签_java和javascript获取word的 书签位置
  13. c语言中的output用法,OUTPUT 子句
  14. 机器学习_正态分布下的贝叶斯分类器
  15. 怎么恢复格式化的sd卡呢?
  16. 2021滴滴笔试题算法题
  17. 怎么提高截屏图片分辨率?照片分辨率低如何做成高清?
  18. chmod -R 777使用.
  19. Python求均值,方差,标准差
  20. 用“埃氏筛法”求2~10000以内的素数。2~100以内的数,先去掉2的倍数,再去掉3的倍数,再去掉5的倍数,……依此类推,最后剩下的就是素数。

热门文章

  1. 浙江大学计算机系自主招生题目,浙江大学自主招生试题
  2. linux 检测SSD寿命
  3. python抓取百度指数详解
  4. 写了一个内核模块实现简单的类似ps命令.
  5. My Seventeenth Page - 赎金信 - By Nicolas
  6. 超级计算机 计算化学,计算化学软件使用经验-超算中心.PDF
  7. Google DFP广告管理系统简介:开始与您的网站进行广告集成
  8. exchange网易企业邮箱服务器设置,网易企业邮箱Exchange协议邮件客户端配置指南...
  9. 计算机c盘垃圾,清理电脑C盘垃圾的小妙招
  10. windows操作系统未关闭默认共享