Android利用Canvas绘图功能来绘制五角星(升级版)

Stella981
• 阅读 743

文章目录

  • 上一篇问题解决

  • 利用Canvas绘图功能来绘制五角星(升级版)

  • 过程

  • 结果

在上一篇文章中,我们利用直线的旋转绘制了五角星。出现了五角星会跑出界面 的情况。

我们就在这儿解决一下这个问题,并呈现另一种实现方式——函数画五角星。

上一篇问题解决

利用Canvas实现绘图功能(绘制五角星)

由于,随机画五角星,使得起始点是随机的,导致可以在移动的画布上随机画,因此会跑出界外。在这儿,我们加入代码,使其记住位置。改进代码如下:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;

import java.util.Random;

public class CanvasView extends View {
    public CanvasView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint1 = new Paint();

        for (int i = 0; i < 10; i++) {

            Paint paint = paint1;
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(5);
            paint.setColor(Color.GREEN);
            paint.setTextSize(24);
            int x = (int) (Math.random() * 600 + 200);
            int y = (int) (Math.random() * 1000 + 100);
            int r = (int) (Math.random() * 250 + 20);
            canvas.save();
            canvas.translate(x, y);
            canvas.drawLine(0, 0, r, 0, paint);
            canvas.translate(r, 0);
            canvas.rotate(144);
            canvas.drawLine(0, 0, r, 0, paint);
            canvas.translate(r, 0);
            canvas.rotate(144);
            canvas.drawLine(0, 0, r, 0, paint);
            canvas.translate(r, 0);
            canvas.rotate(144);
            canvas.drawLine(0, 0, r, 0, paint);
            canvas.translate(r, 0);
            canvas.rotate(144);
            canvas.drawLine(0, 0, r, 0, paint);
            canvas.restore();
        }
    }
}

这样,运行出来结果如下图:
Android利用Canvas绘图功能来绘制五角星(升级版)

有时候可能会出现五角星的角出界面,这只是五角星边的问题。是符合实验要求的。

利用Canvas绘图功能来绘制五角星(升级版)

过程

思路和上一篇文章中的思路大体一样,上篇文章网址:https://blog.csdn.net/qq_44164791/article/details/106147674
不同的只有绘制五角星的思路及代码

先找出各个点,计算出五角星各条线之间的夹角,然后利用path.moveTo();将各个点用线段连接起来,就可以绘制成五角星。具体代码如下:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

import java.util.Random;


public class CanvasView extends View {

    private float xA,yA,xB,yB,xC,yC,xD,yD,xE,yE,xF,yF,xG,yG,xH,yH,xI,yI,xJ,yJ,x,y;//各个点的定义
    private int r;

    public CanvasView(Context context, AttributeSet attrs){
        super(context,attrs);
    }
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint=new Paint();//定义一个画笔
        paint.setColor(Color.RED);//画笔颜色
        canvas.drawRect(0,0,2000,2000,paint);//背景颜色所设计范围
        //canvas.drawRect(700,1000,700,1000,paint);
        //paint.setStyle(Paint.Style.STROKE);//画笔风格1(空心)
        paint.setStyle(Paint.Style.STROKE);//画笔风格2(实心)
        paint.setAntiAlias(true);//设置抗锯齿
        paint.setStrokeWidth(5);//画笔宽度

        //循环
        for (int i=0;i<10;i++){
            //五角星颜色
            paint.setColor(Color.YELLOW);
            //随机生成A点坐标和五角星边长
            Random random=new Random();
            int min=50;
            int max=100;
            r=random.nextInt(max)%(max-min+1)-min;
            x=(float) Math.random()*700;
            y=(float) Math.random()*1000;

            //标出五角星各个点的坐标
            xA=x;
            yA=y;
            xB=x+r;
            yB=y;
            xC=(float)(x+r+r*Math.sin(Math.toRadians(18)));
            yC=(float)(y+r*Math.cos(Math.toRadians(18)));
            xD=(float) (x+r+2*r*Math.sin(Math.toRadians(18)));
            yD=y;
            xE=(float) (x+2*r+2*r*Math.sin(Math.toRadians(18)));
            yE=y;
            xF=(float) (x+2*r+2*r*Math.sin(Math.toRadians(18))-r*Math.cos(Math.toRadians(36)));
            yF=(float)(y-r*Math.sin(Math.toRadians(36)));
            xG=(float) (x+2*r+2*r*Math.sin(Math.toRadians(18))-r*Math.cos(Math.toRadians(36))+r*Math.sin(Math.toRadians(27)));
            yG=(float)(y-r*Math.sin(Math.toRadians(36))-r*Math.cos(Math.toRadians(27)));
            xH=(float)(x+r*Math.cos(Math.toRadians(36))-r*Math.sin(Math.toRadians(27))+r*Math.cos(Math.toRadians(27)));
            yH=(float)(y-r*Math.sin(Math.toRadians(36))-r*Math.cos(Math.toRadians(27))+r*Math.sin(Math.toRadians(27)));
            xI=(float)(x+r*Math.cos(Math.toRadians(36))-r*Math.sin(Math.toRadians(27)));
            yI=(float)(y-r*Math.sin(Math.toRadians(36))-r*Math.cos(Math.toRadians(27)));
            xJ=(float)(x+r*Math.cos(Math.toRadians(36)));
            yJ=(float)(y-r*Math.sin(Math.toRadians(36)));
            Path path=new Path();//定义一个绘制多边形的类
            //开始绘制五角星
            path.moveTo(xA,yA);//起始点
            path.lineTo(xB,yB);
            path.lineTo(xC,yC);
            path.lineTo(xD,yD);
            path.lineTo(xE,yE);
            path.lineTo(xF,yF);
            path.lineTo(xG,yG);
            path.lineTo(xH,yH);
            path.lineTo(xI,yI);
            path.lineTo(xJ,yJ);
            path.close();//闭合
            canvas.drawPath(path,paint);
        }
    }
}

结果

在代码中加入了背景颜色,使得看起来更光鲜艳丽
Android利用Canvas绘图功能来绘制五角星(升级版)

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Python进阶者 Python进阶者
2年前
手把手教你使用CanvasAPI打造一款拼图游戏
一、canvas简介1.canvas是HTML5提供的一种新标签,双标签;2.HTML5 canvas标签元素用于图形的绘制,通过脚本(通常是JavaScript)来完成;3.canvas标签只是图形容器,必须使用脚本来绘制图形;Canvas是一个矩形区域的画布,可以用JavaScript在上面绘画;二、案例目标我们今天的目标是使用HTML5
Stella981 Stella981
2年前
Canvas绘制不规则图形,实现可拖动,编辑
目前的工作在做在线的标注工具,接触canvas一年了,各种绘制,基本上图像的交互canvas都可以完成,也写了几篇关于canvas的文章,遇到的问题也写博客上了,对于canvas有问题的朋友可以去看看。一直想写一个关于canvas系列的东西,也没时间。正好最近再捣鼓canvas,有时间就写一点,一个功能一个功能的写,争取写一个系列。以前都是绘制矩形,
Stella981 Stella981
2年前
H5中canvas和svg绘图方式介绍
在HTML5中包括了两种绘图方式,canvas和svg(矢量呈现),而与canvas不同的是,svg是一种XML标记语言,它既可以单独保存以“.svg”为后缀的文件在浏览器中打开显示,也支持建立svg标签直接嵌入在网页中显示,还可以通过<embedsrc"文件.svg"name"name自命"type"image/svgxml"height
Wesley13 Wesley13
2年前
View绘制系列(10)
Canvas基础变换前面学习了Canvas相关的一些绘制方法,不知道大家发现没?我们都是根据左上角(0,0)点算出来新的坐标,然后再绘制,这样明显不符合我们平常基于坐标原点绘制的习惯,那么我们能不能直接在原点绘制图形,然后通过操作Canvas来实现移动到目标位置呢?答案是肯定的,这就需要用到Canvas变换方法了。Canvas变
Wesley13 Wesley13
2年前
canvas可视化效果之内阴影效果
canvas可视化效果之内阴影效果楔子在之前的一个轨道交通可视化项目中,运用到了很多绘制技巧。可以参考之前的一篇文章《利用canvas阴影功能与双线技巧绘制轨道交通大屏项目效果(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.
Wesley13 Wesley13
2年前
HTML5实现绘制几何图形
HTML5新增了一个<canvas.../属性。该元素自身并不绘制图形,只是相当于一张空画布。如果开发者需要向<canvas.../上绘制图形则必须使用JavaScript脚本进行绘制。为了向<canvas.../元素上绘图,必须经过如下3步。获取<canvas.../元素对应的DOM对象,这是一个Canvas对象。调用Canvas对象
Stella981 Stella981
2年前
HTML5中Canvas元素的使用总结
HTML5中Canvas元素的使用总结  Canvas提供了开发者自定义绘图的接口,我们可以公国getContext()函数来获取绘图上下文进行绘制操作,这个函数中可以传入两个参数,其中第1个参数设置绘图上下文的类型,比较常用的是"2d",我们也可以使用"webgl"来使用webOpenGL实现3D绘制。本篇博
Wesley13 Wesley13
2年前
Unity性能优化整理
纹理优化SpritePacker通过细分导入到Unity的纹理,利用自带的SpritePacker将时间段内需要同时绘制在屏幕上的纹理合并到一个图集中,可以减少Drawcall的开销UGUI优化Canvas1._分离Canvas_画布(Canvas)是U
Wesley13 Wesley13
2年前
12、开源游戏
在前面中我们初始化了游戏的资源,这次我们来说下地图的绘制和游戏主循环设计。地图绘制    以前说过地图是用tiled画好,导出为图片形式的,所以地图的绘制,就是把这个图片绘制到canvas的过程。这样绘制地图就简单了,使用drawImage方法绘制即可。    这里有个2问题,1是地图的大小一般肯定是大于canvas的,所以我们只是把地图