二十多行代码画太极(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

UNITE真菌数据库使用避坑指南:从下载到注释的完整流程

本文提供了UNITE真菌数据库从下载到注释的完整实战指南。针对真菌ITS序列分析,重点解析了数据库版本选择、格式转换的常见陷阱,并详细介绍了如何训练优化的sklearn分类器以提升物种注释的精度和可靠性,帮助用户构建高效稳定的本地工作流。

weixin_29240343的博客 201

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

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

zhouguizhi 1991

高杂合度基因组组装实战:Hifiasm参数调优与purge_dups过滤效果对比(附猪毛菜案例)

本文深入探讨了高杂合度基因组组装中Hifiasm参数调优与purge_dups过滤的实战效果对比,通过猪毛菜案例详细解析了两种方法的适用场景与优化策略。文章重点分析了purge_dups在contig过滤中的显著效果,为基因组组装提供了关键的技术参考。

weixin_29232121的博客 495

ExoPlayer硬解码实战:如何绕过系统默认软解码提升播放性能(附完整代码)

本文深入剖析了ExoPlayer默认解码器选择机制的不确定性,并提供了通过自定义MediaCodecSelector强制启用硬解码的完整实战方案。该方案能有效解决因软解码导致的播放卡顿、黑屏花屏及高功耗问题,显著提升Android应用在各种设备上的视频播放性能与稳定性。

weixin_29295541的博客 456

Android自定义view之太极图

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

计蒙不吃鱼的博客 1万+

5G LDPC编码实战:从校验矩阵到Matlab代码实现(附完整源码)

本文深入解析5G NR标准中的LDPC编码工程实现,聚焦于从3GPP协议中的QC-LDPC校验矩阵到高效Matlab代码的转换。文章详细阐述了基础矩阵(BG1/BG2)选择、提升因子确定以及利用双对角结构的快速编码算法,并提供了完整的、可优化的Matlab源码,旨在帮助通信算法工程师和开发者快速构建5G LDPC编码仿真原型,为硬件实现奠定基础。

table的专栏 377

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

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

2401_87545802的博客 943

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

努力让自己发光,对的人才能迎着光而来 34万+

网神 SecGate 3600 防火墙 app_av_import_save文件上传漏洞(含批量验证poc)

网神 SecGate 3600 防火墙 app_av_import_save文件上传漏洞(含批量验证poc)

weixin_43567873的博客 298

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

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

weixin_36296063的博客 263

【花雕学编程】Arduino FOC 之AS5048A磁编码器模块

您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。在Arduino平台上实现FOC可以提供平滑的运行和高度的扭矩、速度和位置控制,它通过精确控制电机的电流和电压来实现高效率、高精度和低噪声的操作。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1、高性能电机控制:FOC是一种高级的电机控制算法,可以精准控制PMSM(永磁同步电机)和BLDC(无刷直流)电机,实现平滑的转速和扭矩输出。

雕爷学编程 1496

Android绘图之绘制太极图

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

chenkai19920410的专栏 1194

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

weixin_30663789的博客 498

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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、付费专栏及课程。

余额充值