java画太极加图片_Android 画一个太极图实例代码
今天练手一下,一起来画个太极图吧~
最终效果如下:
最终效果
一般都是先讲原理,我就反其道而行,先讲实现吧。
1.继承实现初始化方法
继承View,实现基本的构造函数:
public TestView(Context context) {
this(context, null);
}
public TestView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
在init()方法中,进行初始化操作,这里初始化一下画笔就好。
private Paint mPaint;
private void init() {
initPaint();
}
/**
* 初始化画笔
*/
private void initPaint() {
mPaint = new Paint(); //创建画笔对象
mPaint.setColor(Color.BLACK); //设置画笔颜色
mPaint.setStyle(Paint.Style.FILL); //设置画笔模式为填充
mPaint.setStrokeWidth(10f); //设置画笔宽度为10px
mPaint.setAntiAlias(true); //设置抗锯齿
mPaint.setAlpha(255); //设置画笔透明度
}
在onSizeChanged()方法中获取高宽,便于之后绘制计算。
private int mWidth;
private int mHeight;
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
}
创建两个路径,一下计算就在这两个路径中进行。
private Path path0 = new Path();
private Path path1 = new Path();
然后到最关键的onDraw()方法了,这里会分几步来演示。
1.移动布局到中间
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//移动布局到中间
canvas.translate(mWidth / 2, mHeight / 2);
}
ps:为了简洁,之后的代码都是在onDraw()中逐层增加的,之后就不写onDraw()的外出括号了。
2.画背景黄色
mPaint.setColor(0xffffff00);
path0.addRect(-400, -400, 400, 400, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
第二步.png
3.画白色圆背景,即太极图的白鱼部分。
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
4.画黑色圆背景,即太极图的黑鱼部分,和白鱼一样大小位置,只是把白鱼盖住了,这里就需要用一些boolean运算进行绘制了。
//白鱼的背景
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
//黑鱼的背景
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);//这一段注意,之后要删除
第四步.png
5.对黑鱼(path1)进行boolean计算,把不需要的部分去掉。这里就是要把圆的右半边消除,这里就需要用到path.op()方法了。
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
canvas.drawPath(path0, mPaint);//这一段注意,之后要删除
第五步.png
6.这时候我们已经把不需要的另一半黑色去掉了,但是黑鱼应该有个圆的头,那么我们就拼接一个头给它。
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
path0.rewind();
path0.addCircle(0, -100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.UNION);
canvas.drawPath(path1, mPaint);//这一段注意,之后要删除
第六步.png
7.到这里,我们看到,只需要在绘制一个白鱼的头就可以了,那么也和第五步一样,使用一个boolean运算把多余的黑色去掉即可。
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
path0.rewind();
path0.addCircle(0, -100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.UNION);
path0.rewind();
path0.addCircle(0, 100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
canvas.drawPath(path1, mPaint);
第七步.png
8.至此,已经绘制好了八卦图的背景了,只需要在绘制鱼的眼睛即可。
//画黑色小圆
path0.rewind();
path0.addCircle(0, 100, 50, Path.Direction.CW);
mPaint.setColor(0xff000000);
canvas.drawPath(path0, mPaint);
//画白色小圆
path0.rewind();
path0.addCircle(0, -100, 50, Path.Direction.CW);
mPaint.setColor(0xffffffff);
canvas.drawPath(path0, mPaint);
第八步.png
完成,最后上完整的代码。代码写得有点乱,不过也是练习而已,哈哈。至于其中的boolean运算什么的,之后在我的自定义View的笔记中在写吧。
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by Whitelaning on 2016/6/28.
* Email: whitelaning@qq.com
*/
public class TestView extends View {
private Paint mPaint;
private int mWidth;
private int mHeight;
public TestView(Context context) {
this(context, null);
}
public TestView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
initPaint();
}
/**
* 初始化画笔
*/
private void initPaint() {
mPaint = new Paint(); //创建画笔对象
mPaint.setColor(Color.BLACK); //设置画笔颜色
mPaint.setStyle(Paint.Style.FILL); //设置画笔模式为填充
mPaint.setStrokeWidth(10f); //设置画笔宽度为10px
mPaint.setAntiAlias(true); //设置抗锯齿
mPaint.setAlpha(255); //设置画笔透明度
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
}
private Path path0 = new Path();
private Path path1 = new Path();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//移动布局到中间
canvas.translate(mWidth / 2, mHeight / 2);
//画大背景颜色
mPaint.setColor(0xffffff00);
path0.addRect(-400, -400, 400, 400, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
path0.rewind();
path0.addCircle(0, -100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.UNION);
path0.rewind();
path0.addCircle(0, 100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
canvas.drawPath(path1, mPaint);
//画黑色小圆
path0.rewind();
path0.addCircle(0, 100, 50, Path.Direction.CW);
mPaint.setColor(0xff000000);
canvas.drawPath(path0, mPaint);
//画白色小圆
path0.rewind();
path0.addCircle(0, -100, 50, Path.Direction.CW);
mPaint.setColor(0xffffffff);
canvas.drawPath(path0, mPaint);
}
}
Whitelaning
It's very easy to be different but very difficult to be better
以上就是对Android 实现太极的实例代码,有兴趣朋友可以参考下,谢谢大家对本站的支持!
java画太极加图片_Android 画一个太极图实例代码相关推荐
- java画太极加图片_通过Java 画一个太极图
package demo; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java. ...
- java画太极加图片_新手初学java 尝试编程绘画太极图
我是个新手,对java理解还不深入,看了些java方面的基础视频,自己尝试着把中国的古老的太极图给画出来,经过一些思考和动手,终于把太极图给绘画出来. 记得以前某位高手也画过类似的太极图,不过当时自己 ...
- android view存储为jpg,Android长按imageview把图片保存到本地的实例代码
工具类 之前用 AsyncTask 现在改用rxJava public class SaveImageUtils { public static void imageSave(final ImageV ...
- tableview插入刷新_iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码...
废话不多说了,直接给大家贴代码了. 具体代码如下所示: #import "ViewController.h" #import "TuanGouModel.h" ...
- java实现人民币数字转换中文大写的工具实例代码demo分享
原文:java实现人民币数字转换中文大写的工具实例代码demo分享 http://www.zuidaima.com/share/1816208858221568.htm 刚好在项目里面用到了数字转化为 ...
- 用php语句绘制圆锥,JS+canvas画一个圆锥实例代码_javascript技巧
本篇文章给大家讲解html中用canvas函数配合JS画出一个圆锥形的图形实例,canvas是html5中新增加的新属性,对HTML5中的canvas感兴趣的朋友学习测试下吧. 以下是我们给大家分享是 ...
- python画一朵花图片_Python 画一朵花
今天看Python画画的东西,看到用正方形画圆 觉得很有趣,就尝试了下. 画出来长这样: 画图过程如下:用五边形画圆?https://www.zhihu.com/video/1127633175656 ...
- python turtle库画七彩蟒蛇_Python实现七彩蟒蛇绘制实例代码
本文主要研究的是Python编程turtle的实例,绘制一个七彩蟒蛇..具体如下. 第2周的课后练习里,有一道题目,要求修改"蟒蛇绘制"程序,对Python 蟒蛇的每个部分采用不同 ...
- 如何用python画七彩蟒蛇_Python实现七彩蟒蛇绘制实例代码
本文主要研究的是Python编程turtle的实例,绘制一个七彩蟒蛇..具体如下. 第2周的课后练习里,有一道题目,要求修改"蟒蛇绘制"程序,对Python 蟒蛇的每个部分采用不同 ...
最新文章
- java判断两个int相等_Java 判断两个变量是否相等
- Raid mdadm lvm
- 富文本编译器UEditor+SSM的使用
- 如何设置顶部和底部固定,中间填满
- IHttpHandler与IHttpHandlerFactory的区别一例
- matcaffe训练与测试
- python关闭csv文件_Python文件处理(txt、csv文件读取)
- √【物流网络规划】库存和仓储 warehouse
- DataScope v1.0 串口虚拟示波器使用
- Android动态换肤框架PrettySkin原理篇(一)- LayoutInflater的理解及使用
- 学python千万别想当然
- 超星问卷与麦客问卷自动填写(selenium+Chrome)
- 共享网络获取树莓派ip_从零开始:树莓派共享 WiFi 秒变无线热点(树莓派路由器...
- 全国高中数学联赛——几何
- JavaScript 中 let 的使用
- maven使用,Nexus配置阿里云代理仓库,三方仓库,本地仓库
- C#,背包问题(Knapsack Problem)贪心算法的源代码
- HDG西安站| 聚焦华为 IoT 技术: Huawei LiteOS + OceanConnect
- 微信小程序开发教程:项目五导航组件 课后习题
- 图片花絮《敏捷落地-深圳(20140517-18)》