位置: 编程技术 - 正文

android Graphics(一):概述及基本几何图形绘制

编辑:rootadmin

推荐整理分享android Graphics(一):概述及基本几何图形绘制,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

前言:我最近想抽空研究研究android的各种特效,android的特效真是其它平台无法比拟的,而且一个漂亮的UI交互,会给APP增色不少,而学习特效之前,有关graphics绘图的基础知识是必不可少的,下面就分几篇对涉及到的基础知识进行梳理。

志不强者智不达,言不信者行不果。——墨翟

(凡诸事有成者都有惊人的毅力做后盾,相信自己,持之以恒,不久的将来,我们都将有一番成就,勤不富也饱,懒不死也饿)

相关文章:

1、《android Graphics(一):概述及基本几何图形绘制》2、《android Graphics(二):路径及文字》3、《android Graphics(三):区域(Range)》4、《android Graphics(四):canvas变换与操作》

一、Paint与Canvas

像我们平时画图一样,需要两个工具,纸和笔。Paint就是相当于笔,而Canvas就是纸,这里叫画布。

所以,凡有跟要要画的东西的设置相关的,比如大小,粗细,画笔颜色,透明度,字体的样式等等,都是在Paint里设置;同样,凡是要画出成品的东西,比如圆形,矩形,文字等相关的都是在Canvas里生成。

下面先说下Paint的基本设置函数:

paint.setAntiAlias(true);//抗锯齿功能paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式paint.setStrokeWidth();//设置画笔宽度paint.setShadowLayer(, , , Color.GREEN);//设置阴影

前两个没什么好说的,看填充样式的区别:

1、void setStyle (Paint.Style style) 设置填充样式

Paint.Style.FILL :填充内部Paint.Style.FILL_AND_STROKE :填充内部和描边Paint.Style.STROKE :仅描边

看下这三个类型的不同,下面以画的一个圆形为例:

可见,FILL与FILL_AND_STROKE没什么区别。

2、setShadowLayer (float radius, float dx, float dy, int color) 添加阴影

参数:

radius:阴影的倾斜度dx:水平位移dy:垂直位移

使用代码:

[java] view plaincopypaint.setShadowLayer(, , , Color.GREEN);//设置阴影

然后是Canvas的基本设置:

画布背景设置:

canvas.drawColor(Color.BLUE);canvas.drawRGB(, , 0); //这两个功能一样,都是用来设置背景颜色的。二、实例操作

先给大家讲下怎么在写画图程序,大家可以边看边写边看效果是怎样的,先利用一个画直线的函数来测试一下吧,划直线当然是canvas.drawline();上面说了,有关画笔设置的都是Paint,有关画图的都在Canvas类中;

1、首先新建一个工程,把默认的XML改成FrameLayout布局,布局代码如下:

[html] view plaincopy<FrameLayout xmlns:android=" xmlns:tools=" android:id="@&#;id/root" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.try_paint_blog.MainActivity" > </FrameLayout>

这里有个特别要注意的地方,给根结点FrameLayout加一个ID号,后面用来在它的内部添加视图用的

2、然后新建一个视图类,派生自View,为什么要新建视图类呢,因为我们要自由的显示东西,当然要重写视图类了,在OnDraw()函数中返回什么,这个视图就会长什么样。话不多说,新建一个派生自View的类MyView,然后重写OnDraw()函数:[java] view plaincopypublic class MyView extends View { Context m_context; public MyView(Context context) { super(context); // TODO Auto-generated constructor stub m_context=context; } //重写OnDraw()函数,在每次重绘时自主实现绘图 @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); //设置画笔基本属性 Paint paint=new Paint(); paint.setAntiAlias(true);//抗锯齿功能 paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 Style.FILL/Style.FILL_AND_STROKE/Style.STROKE paint.setStrokeWidth(5);//设置画笔宽度 paint.setShadowLayer(, , , Color.GREEN);//设置阴影 //设置画布背景颜色 canvas.drawRGB(, ,); //画圆 canvas.drawCircle(, , , paint); } } 在这段代码中,首先对画笔进行基本的样式设置,(对几何图形设置阴影,好像没作用),然后利用DrawCircle()画了一个圆。关于这个函数,下面会再讲,大家只知道用来画圆就好了。3、视图类写好了,下面就要将其加入到Activity中,让它显示出来,在MainActiviy中添加如下代码:[java] view plaincopypublic class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FrameLayout root=(FrameLayout)findViewById(R.id.root); root.addView(new MyView(MainActivity.this)); } } 首先找到FrameLayout结点,然后把新生成的MyView实例加入到其中。运行之后,效果如下:

源码下载地址: drawLine (float startX, float startY, float stopX, float stopY, Paint paint)

参数:

startX:开始点X坐标startY:开始点Y坐标stopX:结束点X坐标stopY:结束点Y坐标

[java] view plaincopyPaint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth(5);//设置画笔宽度 canvas.drawLine(, , , , paint);

2、多条直线

void drawLines (float[] pts, Paint paint)void drawLines (float[] pts, int offset, int count, Paint paint)

参数:

pts:是点的集合,大家下面可以看到,这里不是形成连接线,而是每两个点形成一条直线,pts的组织方式为{x1,y1,x2,y2,x3,y3,……}

[java] view plaincopyPaint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth(5);//设置画笔宽度 float []pts={,,,,,,,}; canvas.drawLines(pts, paint);

(上面有四个点:(,)、(,),(,),(,)),两两连成一条直线;

android Graphics(一):概述及基本几何图形绘制

3、点

void drawPoint (float x, float y, Paint paint)

参数:float X:点的X坐标float Y:点的Y坐标

[java] view plaincopyPaint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth();//设置画笔宽度 canvas.drawPoint(, , paint);

4、多个点

void drawPoints (float[] pts, Paint paint)void drawPoints (float[] pts, int offset, int count, Paint paint)

参数:float[] pts:点的合集,与上面直线一直,样式为{x1,y1,x2,y2,x3,y3,……}int offset:集合中跳过的数&#;个数,注意不是点的个数!一个点是两个数&#;;count:参与绘制的数&#;的个数,指pts[]里人数&#;个数,而不是点的个数,因为一个点是两个数&#;

下面举例说明上面offset与count的含义:(跳过第一个点,画出后面两个点,第四个点不画),注意一个点是两个数&#;!

[java] view plaincopyPaint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth();//设置画笔宽度 float []pts={,,,,,,,}; canvas.drawPoints(pts, 2, 4, paint); (同样是上面的四个点:(,)、(,),(,),(,),drawPoints里路过前两个数&#;,即第一个点横纵坐标,画出后面四个数&#;代表的点,即第二,第三个点,第四个点没画;效果图如下)

5、矩形工具类RectF与Rect

这两个都是矩形辅助类,区别不大,用哪个都行,根据四个点构建一个矩形结构;在画图时,利用这个矩形结构可以画出对应的矩形或者与其它图形Region相交、相加等等;

RectF:

构造函数有下面四个,但最常用的还是第二个,根据四个点构造出一个矩形;

RectF()RectF(float left, float top, float right, float bottom)RectF(RectF r)RectF(Rect r)

Rect

构造函数如下,最常用的也是根据四个点来构造矩形

Rect()Rect(int left, int top, int right, int bottom)Rect(Rect r)

6、矩形

void drawRect (float left, float top, float right, float bottom, Paint paint)void drawRect (RectF rect, Paint paint)void drawRect (Rect r, Paint paint)

参数:

第一个的写法是直接传入矩形的四个点,画出矩形

第二、三个构造函数是根据传入RectF或者Rect矩形变量来指定所画的矩形的

[java] view plaincopyPaint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth();//设置画笔宽度 canvas.drawRect(, , , , paint);//直接构造 RectF rect = new RectF(, , , ); canvas.drawRect(rect, paint);//使用RectF构造 Rect rect2 = new Rect(, , , ); canvas.drawRect(rect2, paint);//使用Rect构造

7、圆角矩形

void drawRoundRect (RectF rect, float rx, float ry, Paint paint)

参数:RectF rect:要画的矩形float rx:生成圆角的椭圆的X轴半径float ry:生成圆角的椭圆的Y轴半径

[java] view plaincopyPaint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth();//设置画笔宽度 RectF rect = new RectF(, , , ); canvas.drawRoundRect(rect, , , paint);

8、圆形

void drawCircle (float cx, float cy, float radius, Paint paint)

参数:float cx:圆心点X轴坐标 float cy:圆心点Y轴坐标float radius:圆的半径

[java] view plaincopyPaint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth();//设置画笔宽度 canvas.drawCircle(, , , paint);

9、椭圆

椭圆是根据矩形生成的,以矩形的长为椭圆的X轴,矩形的宽为椭圆的Y轴,建立的椭圆图形

void drawOval (RectF oval, Paint paint)

参数:RectF oval:用来生成椭圆的矩形

[java] view plaincopyPaint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.STROKE);//填充样式改为描边 paint.setStrokeWidth(5);//设置画笔宽度 RectF rect = new RectF(, , , ); canvas.drawRect(rect, paint);//画矩形 paint.setColor(Color.GREEN);//更改画笔颜色 canvas.drawOval(rect, paint);//同一个矩形画椭圆

、弧

弧是椭圆的一部分,而椭圆是根据矩形来生成的,所以弧当然也是根据矩形来生成的;

void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

参数:RectF oval:生成椭圆的矩形float startAngle:弧开始的角度,以X轴正方向为0度float sweepAngle:弧持续的角度boolean useCenter:是否有弧的两边,True,还两边,False,只有一条弧

(1)将画笔设为描边,效果:

[java] view plaincopyPaint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.STROKE);//填充样式改为描边 paint.setStrokeWidth(5);//设置画笔宽度 RectF rect1 = new RectF(, , , ); canvas.drawArc(rect1, 0, , true, paint); RectF rect2 = new RectF(, , , ); canvas.drawArc(rect2, 0, , false, paint); (二)、将画笔设为填充[java] view plaincopyPaint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//填充样式改为描边 paint.setStrokeWidth(5);//设置画笔宽度 RectF rect1 = new RectF(, , , ); canvas.drawArc(rect1, 0, , true, paint); RectF rect2 = new RectF(, , , ); canvas.drawArc(rect2, 0, , false, paint);

本文所涉及到的代码,进行整理,提供大家源码下载

源码下载地址: 谢谢!

App安全之代码混淆 参考:

Android应用程序拍照行为C层拦截实现 Android应用程序拍照行为C层拦截实现一、Binder简介Android平台的进程之间需要频繁的通信,比如打开一个应用便需要Home应用程序进程和运行在system_server进

Android: wifi打开和关闭的流程解析 1,组件图提供了wifi打开/关闭时,一些相关模块的依赖关系。2,简介:wifi打开:由jni依赖的libnetutils.so提供wifi驱动的加载。由netd来完成softap相关的fwrel

标签: android Graphics(一):概述及基本几何图形绘制

本文链接地址:https://www.jiuchutong.com/biancheng/382225.html 转载请保留说明!

上一篇:[置顶] Android自定义TabBar([置顶]JM259194)

下一篇:App安全之代码混淆(安全的代码)

  • 政府农民合作社架构
  • 待抵扣税金怎么算
  • 偷逃税款是什么
  • 无形资产摊销完后有余额吗
  • 三供一业移交内容
  • 出口退税逾期申报,需申报出口货物收汇情况表
  • 二房东转租需要备案吗
  • 2019年研发费用加计扣除标准
  • 应税劳务和应税服务不合理列支的有哪些
  • 特许权使用费增值税征收品目
  • 新办商贸企业一般纳税人合同金额
  • 哪些税种计税价格是含增值税
  • 车位出售时要交什么税
  • 捐赠的所得税怎么处理
  • 差旅费包括哪些明细
  • 个人捐赠支出扣除30%和100%扣除
  • 付垫资款给其他公司应该怎么做账?
  • 收到联营单位投入的设备一台
  • 旅行社的税
  • 购买防疫物资计划
  • 营业外收入不纳税?
  • 租赁发票需要写税号吗
  • 股权投资收入会计处理
  • win11家庭版怎么激活
  • linux命令df -h结果详解
  • uefiu盘安装系统步骤win10
  • php字符串赋值
  • 公司准备上市到真正上市要多久
  • 专项储备购买安全设备会计分录
  • 劳务派遣公司的账务处理
  • wordpress简码怎么用
  • 关于交易性金融资产的问题
  • 微信小程序实现支付功能
  • 公司向股东借款多久必须归还
  • 企业资产负债表有何作用
  • 在生产经营过程中违反什么规定
  • 购入固定资产款项已付
  • ChatGPT等大模型的模型量化:平滑量化法
  • python 微信
  • 支付宝是商品吗
  • 工程完工补付工程款会计分录
  • 一般纳税人年收入500万交多少税
  • 自然人税收管理系统扣缴客户端官网
  • 增值税发票抵扣期限是多久
  • mysql中的索引有
  • 固定资产直接记入费用科目
  • sql 附加数据库
  • 固定资产中的动产和不动产
  • 销售公司的主营业务成本怎么算
  • 子公司注销合并报表少数股东权益的处理
  • 职工薪酬都包括什么
  • 存货发出的计价方式有哪些
  • 委托代理进口账务处理
  • 进口关税,增值税是进口设备重置成本中的从属费用
  • 支付银行贷款利息的会计处理
  • 税后扣款怎么做账
  • 小规模纳税人不超过10万免增值税
  • 销售成本的结转
  • 合并报表成本法调整为权益法分录
  • 合伙企业应该用什么会计制度
  • windows7快速截图
  • linux ssh rsa
  • win8截屏在哪个文件夹
  • 不知道,不知道
  • linux统计文件中每个单词出现的次数
  • win10专业版怎么改用户名
  • python怎么图像处理
  • js中的onchange
  • python最简单
  • python2与python3的区别
  • javascript代码规范
  • Android-Canvas.drawText()详解
  • 用javascript
  • 金税三期个税下载官网手机版
  • 房地产预缴土增值税
  • 深圳市地税局财务电话
  • 小规模纳税人购买车辆可以抵扣税吗
  • blueerdos和鄂尔多斯区别
  • 地方税务机关税率是多少
  • 五险一金和公积金冲突吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设