二十多行代码画太极(Android中的Canvas)

Android 自定义View 太极图 Android 自定义View 太极图。 阅读详情

作者微博: @攻城师sloop

先上效果图

taiji

说明

本内容主要讲解安卓中2D绘图相关内容,安卓中2D绘图主要用的是Canvas(翻译过来好像叫画布吧)

先简单介绍一下Canvas的常用功能:

Canvas可以绘制的对象:
弧线(arcs)
填充颜色(argb 和 color)
位图(Bitmap)
圆(circle 和 oval)
点(point)
线(line)
矩形(Rect)
图片(Picture)
圆角矩形(RoundRect)
文本(text)
定点(Vertices)
路径(path)
PS:Canvas中可以的绘制方法一般均为draw开头,例如绘制圆形就是drawCircle

Canvas位置操作方法
旋转(rotate)
缩放(scale)
位移(translate)
扭曲(skew)

Canvas提供的其他方法
获得转换矩阵(Matrix)
保存(save)
回滚(restore)

以上内容仅供参考,本篇文章重点不是这些,想要了解Canvas基本用法可以参考这篇文章 Android Canvas绘图详解(图文)

下面讲解本文的核心内容,将会分步骤讲解如何用正确的姿势绘制一个太极。

绘制太极

1.定义画笔

由于太极图像由黑白两色构成,为了方便就定义了两个画笔,分别绘制黑色和白色。

        private Paint whitePaint;   //白色画笔
        private Paint blackPaing;   //黑色画笔

        //初始化画笔函数
        private void initPaints() {
            whitePaint = new Paint();
            whitePaint.setAntiAlias(true);
            whitePaint.setColor(Color.WHITE);

            blackPaing = new Paint();
            blackPaing.setAntiAlias(true);
            blackPaing.setColor(Color.BLACK);
        }

2.在构造函数中初始化画笔

        //用户直接new一个View时会被调用
        public TaiJi(Context context) {
            super(context);
            initPaints();       //初始化画笔
        }

        //用户在Layout文件中使用这个View时会被调用
        public TaiJi(Context context, AttributeSet attrs) {
            super(context, attrs);
            initPaints();       //初始化画笔
        }

3.在onDraw中使用Canvas绘制内容

3.1 确定视图的中心
int width = canvas.getWidth();                          //画布宽度
int height = canvas.getHeight();                        //画布高度
Point centerPoint = new Point(width / 2, height / 2);   //画布中心点
3.2 将Canvas坐标原点移动到视图中心
canvas.translate(centerPoint.x, centerPoint.y);         //将画布移动到中心
3.3 绘制背景色
canvas.drawColor(Color.GRAY);                           //绘制背景色
3.4 确定太极的半径大小并绘制两个半圆
//绘制两个半圆
int radius = Math.min(width, height) / 2 - 100;             //太极半径
RectF rect = new RectF(-radius, -radius, radius, radius);   //绘制区域
canvas.drawArc(rect, 90, 180, true, blackPaing);            //绘制黑色半圆
canvas.drawArc(rect, -90, 180, true, whitePaint);           //绘制白色半圆

在这里稍微解释一下drawArc绘制圆弧方法几个参数的意义。

RectF oval          //绘制的区域(是一个矩形)
float startAngle    //开始角度
float sweepAngle    //扫过角度
boolean useCenter   //是否使用中心
Paint paint         //画笔

另外,由于移动设备屏幕的坐标系和我们在数学中常用的坐标系稍微有点区别,需要注意一下。
在移动设备中一般定义左上角为坐标零点,x轴坐标向右增大,y轴坐标向下增大。而在数学坐标系中一般定义y轴坐标向上为增大方向,所以两者y轴刚好是反向的。

3.5 绘制两个小圆
//绘制两个小圆
int smallRadius = radius / 2;   //小圆半径为大圆的一般
canvas.drawCircle(0, -smallRadius, smallRadius, blackPaing);
canvas.drawCircle(0, smallRadius, smallRadius, whitePaint);

3.6 绘制鱼眼
//绘制鱼眼(两个更小的圆)
canvas.drawCircle(0, -smallRadius, smallRadius / 4, whitePaint);
canvas.drawCircle(0, smallRadius, smallRadius / 4, blackPaing);

4.让太极旋转起来

4.1 设置旋转角度变量,并提供外部访问接口
private float degrees = 0;          //旋转角度
public void setRotate(float degrees) {
    this.degrees = degrees;
    invalidate();                   //重绘界面
}
4.2 在实际绘制之前调用旋转函数
//在绘制完背景色后调用即可
canvas.rotate(degrees);
4.3 不断改变旋转角度
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final TaiJi taiJi = new TaiJi(this)
    setContentView(taiJi);
    final Handler handler = new Handler() {
        private float degrees = 0;
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
                taiJi.setRotate(degrees += 2);
                this.sendEmptyMessageDelayed(0, 20);
            }
        };

        handler.sendEmptyMessageDelayed(0, 20);
    }

taiji

5.完整代码

获取完整代码请点这里源代码

最后

虽然写了这么长,但核心代码不过二十几行,其实还是挺简单的。
欢迎转载分享,转载请标明作者:攻城师sloop
另外,如果你觉得不错,顺手点个赞呗

画太极图的C++代码实现 绘制太极图的原理简单来说就是画两个半圆一黑一白 拼成一个正圆 再在大圆的左侧和右侧画两个恰好相切的黑圆和白圆作为突出端 最后分别在这两个突出端里面画两个一黑一白的小洞 MFC里利用void CDrawView::OnDraw CDC pDC 这个函数进行绘图 和课堂上绘制正弦曲线相比 如果用一笔一笔循环的方式画圆将会很复杂 因此我就参考网上的 用Pie函数和Ellipse函数画弧和圆 画图用了CBrush画刷和CPen画笔 ">绘制太极图的原理简单来说就是画两个半圆一黑一白 拼成一个正圆 再在大圆的左侧和右侧画两个恰好相切的黑圆和白圆作为突出端 最后分别在这两个突出端里面画两个一黑一白的小洞 MFC里利用void CDrawView::OnDraw CDC pDC 这 [更多] 立即下载

相关推荐

Android学习教程之2D绘图基础及绘制太极图

主要给大家介绍了Android中2D绘图基础的相关资料,文中介绍了绘图的基础内容,以及通过Canvas和Paint实现绘制太极图的详细过程,对各位Android新手开发者们具有一定的参考价值,需要的朋友下面来一起看看吧。

Android画一个太极图

转载地址:http://www.jianshu.com/p/2a9e5ddbeb26 今天练手一下,一起来画个太极图吧~ 最终效果如下: 最终效果 一般都是先讲原理,我就反其道而行,先讲实现吧。 1.继承实现初始化方法 继承View,实现基本的构造函数: public TestView(Context context) {

l_215851356的专栏 788

AgentFlow:模块化智能体框架与Flow-GRPO强化学习实战解析

在人工智能领域,大语言模型(LLM)与智能体(Agent)技术正推动着自动化任务处理的发展。其核心原理在于通过规划、执行与反馈的循环,使AI系统能够自主调用工具解决复杂问题。这一技术的价值在于突破单一模型的局限性,实现更可靠的多步骤推理。在实际应用中,智能体框架需要处理搜索、代码执行、数学计算等多种场景。本文聚焦的AgentFlow框架,正是通过模块化设计将智能体拆分为规划者、执行者、验证者和生成者四个专家模块,并引入Flow-GRPO强化学习算法进行流程内优化。该框架在搜索增强与工具调用等任务上展现出显著

weixin_42311427的博客 369

android 自定义view实现太极图效果

android 自定义view实现太极图效果

zhouguizhi 1991

整合WGCNA、机器学习和孟德尔随机化

(G)通过蛋白质免疫印迹法(Western blot)测定的 UT-B(由 SLC14A1 编码)、ARHGEF38、NEFH、MSMB、KRT23 和 KRT15 在前列腺癌肿瘤组织和癌旁非癌组织中的蛋白质表达水平。本研究利用来自基因表达综合数据库(GEO)的数据集筛选差异表达基因(DEGs),并采用加权基因共表达网络分析(WGCNA),以识别在模块中与前列腺癌高度相关的驱动基因。(F)蓝绿色模块中的模块成员关系(MM)与前列腺癌(PCa)的基因显著性(GS)的散点图。(D)6 个基因之间的相关性分析。

多组・学・多组学 1138

形位公差标注的常见误区与优化策略

本文深入解析机械设计中形位公差标注的常见误区与优化策略,特别针对NX2406用户提供实用技巧。从标注冗余、基准选择到公差值设定等五大误区入手,结合工程图实例展示如何提升标注精度与效率,帮助工程师避免常见错误,优化设计流程,确保零件功能实现与制造可行性。

info6的博客 245

Android自定义view之太极图

太极图 周四课余时间比较多,正好前几天为了给小学弟解决问题,回顾了一些Android的知识,(上学还是不能把以前上班学到的东西丢掉)于是写一篇关于自定义view的文章。 文章目录太极图最后完成的样子(可旋转)一、先画一个太极二、让太极旋转三、自定义属性(颜色,动画速度)四、源码总结 最后完成的样子(可旋转) 这篇文章主要内容为使用Canvas画简单图案,自定义属性,以及属性动画ObjectAnimator中的旋转动画 提示:以下是本篇文章正文内容 一、先画一个太极 先介绍一下定义的东西:

计蒙不吃鱼的博客 1万+

从mseed到SAC格式转换全攻略:mseed2sac工具安装与批量处理技巧

本文详细介绍了如何将mseed格式的地震数据高效转换为SAC格式,涵盖mseed2sac工具的安装、单文件转换技巧、批量处理自动化实现以及元数据高级处理策略。通过具体命令和脚本示例,帮助地震学研究者快速掌握数据预处理的关键技术,提升波形数据分析效率。

ruby5的博客 927

Android自定义view之太极图,Android从入门到精通

/最后测量得到的值//左太极的颜色(黑)//右太极的颜色(白)

2401_87545802的博客 943

uniapp - 解决uni.getLocation定位不准有偏差,定位经纬度不准确有几百米误差、获取地图定位有偏差怎么办,已配置高精确度但依旧不精准(uni.getLocation定位不准如何解决)

uni.getLocation,获取当前的地理位置、速度。已经设置altitude高精度,uniapp API获取定位有差异问题解决,获取定位有几百米偏差,uni.getLocation(OBJECT)中使用默认type ”wgs84“会导致定位不准的问题,gcj02,uni.getLocation地图定位不准,获取经纬度错误偏移了几十公里,经纬度的精确度误差,怎么消除经纬度偏差,解决 uniapp uni.getLocation 定位经纬度不准问题,使用定位不准,定位不准误差问题,解决定位不准问题,高德地

✅ 精选推荐文章 1万+

【微服务】SpringBoot 4.0 新特性整合项目实战应用详解

SpringBoot 4.0 新特性整合项目实战应用详解

congge 4589

java画太极加图片_Android 画一个太极图实例代码

今天练手一下,一起来画个太极图吧~最终效果如下:最终效果一般都是先讲原理,我就反其道而行,先讲实现吧。1.继承实现初始化方法继承View,实现基本的构造函数:public TestView(Context context) {this(context, null);}public TestView(Context context, AttributeSet attrs) {this(context...

weixin_36296063的博客 263

零基础做完YOLOv8船只检测系统:HRSC2016数据集 + 完整UI,稳过答辩

亲爱的同学,通过这篇教程,你已经掌握了“基于YOLOv8的HRSC2016微小船只检测系统”从数据集处理、模型训练到Tkinter界面开发的全流程。这个课题既贴合“海事智能化”的产业战略,又涵盖了“目标检测、深度学习、界面开发”等多个毕设评分点,非常适合作为计算机或海事工程专业的毕业设计。在实践中,你可能会遇到“海面背景复杂导致船只漏检”“微小船只识别精度不足”“UI与模型推理同步卡顿”等挑战——别担心,这些都是技术成长的必经之路。

FJN110的博客 108

Android绘图之绘制太极图

Android是通过graphics类来显示2D图形的。其中graphics中包括了Canvas、Paint、Color、Bitmap等类。graphics具有绘制点、线、颜色、2D几何图形、图像处理等功能。其中Color和Bitmap是很常用的类,我要讲的是Canvas和Paint。顾名思义就是画布和画笔。接下来我将通过绘制太极图来学习Android绘图机制。   Paint类   和日常绘图

chenkai19920410的专栏 1194

【x265编码器】章节1——x265的lookahead模块分析

目录一、模块功能二、lookahead模块分析1.调用流程2.代码分析Lookahead::addPicture()Lookahead::checkLookaheadQueue()Lookahead::getDecidedPicture()Lookahead::findJob()Lookahead::slicetypeDecide()PreLookaheadGroup::processTasksLookaheadTLD::lowresIntraEstimate()Lookahead::slicetypeAn

vcvdv123的博客 4万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android自定义控件旋转,Android自定义View之旋转的太极

坚持学习每一天爱生活,爱分享如果您喜欢我的文章,可以点击关注,喜欢 先看看最终效果 image.png首先新建一个类TaiJi集成VIew,并设置2个画笔public class TaiJi extends View{private Paint blackPaint;//黑色画笔private Paint whitePaint;//白色画笔public TaiJi(Context contex...

weixin_39665507的博客 266

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

canvas绘制四分之一圆_用canvas画太极图(一步步详解附带源代码)

canvas绘图该元素负责在页面中设定一个区域,然后由js动态地在这个区域中绘制图形。这个技术最早是由美国苹果公司推出的,目的是为了取代flash,很快主流浏览器都支持它。绘制路径要绘制路径首先必须调用beginPath()方法,如果想绘制一条连接到起点的线条则调用closePath()方法;如果路径已完成,你想用fillStyle填充它,可以调用fill()方法。另外还可以调用stroke()方...

weixin_30663789的博客 498

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Canvas画太极图

int width=360; private Paint paint; private RectF rectf; public TaijiTu(Context context) { super(context); init(); } public TaijiTu(Context context, @Nullable A

呵呵呵 672

mysql 图标 太极_Android 画布 canvas 太极图

自定义viewpackage cn.mf.cts;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Point;import android.graphics...

weixin_28879085的博客 136

Android4太极,Android 绘制太极图实例详解

Android 绘制太极图绘制一个太极图实现代码:package com.jackie.taijicircle;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphic...

weixin_29613721的博客 203

画太极

前几天看到http://www.gcssloop.com/customview/taiji这个copor写的太极蛮好玩的。自己也写了一个玩玩。package com.zhou.zonghe.utils;import java.util.Set;import android.R.integer; import android.content.Context; import android.graphi

zhou4781182的博客 559

canvas 太极

canvas 太极闲着无事,想起来使用canvas画个太极玩玩,直接上代码var c=document.getElementById("myCanvas"); var cxt=c.getContext("2d"); //绘制左侧的白色半圆直径都是150 cxt.fillStyle="#FFFFFF"; cxt.beginPath(); cxt.arc(300,

LygTom的博客 494
上一篇: 安卓统一添加activity切换动画
下一篇: Retrofit2实现App自动更新
Ray534
博客等级 码龄12年 2粉丝 2原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值