前言:我最近想抽空研究研究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(30);//设置画笔宽度
  • paint.setShadowLayer(10, 15, 15, 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:垂直位移

使用代码:

  1. paint.setShadowLayer(10, 15, 15, Color.GREEN);//设置阴影

然后是Canvas的基本设置:

画布背景设置:

  • canvas.drawColor(Color.BLUE);
  • canvas.drawRGB(255, 255, 0);   //这两个功能一样,都是用来设置背景颜色的。

二、实例操作

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

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

  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:id="@+id/root"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context="com.example.try_paint_blog.MainActivity" >
  7. </FrameLayout>

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

2、然后新建一个视图类,派生自View,为什么要新建视图类呢,因为我们要自由的显示东西,当然要重写视图类了,在OnDraw()函数中返回什么,这个视图就会长什么样。话不多说,新建一个派生自View的类MyView,然后重写OnDraw()函数:

  1. public class MyView extends View {
  2. Context m_context;
  3. public MyView(Context context) {
  4. super(context);
  5. // TODO Auto-generated constructor stub
  6. m_context=context;
  7. }
  8. //重写OnDraw()函数,在每次重绘时自主实现绘图
  9. @Override
  10. protected void onDraw(Canvas canvas) {
  11. // TODO Auto-generated method stub
  12. super.onDraw(canvas);
  13. //设置画笔基本属性
  14. Paint paint=new Paint();
  15. paint.setAntiAlias(true);//抗锯齿功能
  16. paint.setColor(Color.RED);  //设置画笔颜色
  17. paint.setStyle(Style.FILL);//设置填充样式   Style.FILL/Style.FILL_AND_STROKE/Style.STROKE
  18. paint.setStrokeWidth(5);//设置画笔宽度
  19. paint.setShadowLayer(10, 15, 15, Color.GREEN);//设置阴影
  20. //设置画布背景颜色
  21. canvas.drawRGB(255, 255,255);
  22. //画圆
  23. canvas.drawCircle(190, 200, 150, paint);
  24. }
  25. }

在这段代码中,首先对画笔进行基本的样式设置,(对几何图形设置阴影,好像没作用),然后利用DrawCircle()画了一个圆。关于这个函数,下面会再讲,大家只知道用来画圆就好了。
3、视图类写好了,下面就要将其加入到Activity中,让它显示出来,在MainActiviy中添加如下代码:

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. FrameLayout root=(FrameLayout)findViewById(R.id.root);
  7. root.addView(new MyView(MainActivity.this));
  8. }
  9. }

首先找到FrameLayout结点,然后把新生成的MyView实例加入到其中。
运行之后,效果如下:

源码下载地址:http://download.csdn.net/detail/harvic880925/7834517

三、基本几何图形绘制

1、画直线

void drawLine (float startX, float startY, float stopX, float stopY, Paint paint)

参数:

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

  1. Paint paint=new Paint();
  2. paint.setColor(Color.RED);  //设置画笔颜色
  3. paint.setStyle(Style.FILL);//设置填充样式
  4. paint.setStrokeWidth(5);//设置画笔宽度
  5. canvas.drawLine(100, 100, 200, 200, 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,……}

  1. Paint paint=new Paint();
  2. paint.setColor(Color.RED);  //设置画笔颜色
  3. paint.setStyle(Style.FILL);//设置填充样式
  4. paint.setStrokeWidth(5);//设置画笔宽度
  5. float []pts={10,10,100,100,200,200,400,400};
  6. canvas.drawLines(pts, paint);

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

3、点

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

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

  1. Paint paint=new Paint();
  2. paint.setColor(Color.RED);  //设置画笔颜色
  3. paint.setStyle(Style.FILL);//设置填充样式
  4. paint.setStrokeWidth(15);//设置画笔宽度
  5. canvas.drawPoint(100, 100, 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的含义:(跳过第一个点,画出后面两个点,第四个点不画),注意一个点是两个数值!

  1. Paint paint=new Paint();
  2. paint.setColor(Color.RED);  //设置画笔颜色
  3. paint.setStyle(Style.FILL);//设置填充样式
  4. paint.setStrokeWidth(15);//设置画笔宽度
  5. float []pts={10,10,100,100,200,200,400,400};
  6. canvas.drawPoints(pts, 2, 4, paint);

(同样是上面的四个点:(10,10)、(100,100),(200,200),(400,400),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矩形变量来指定所画的矩形的

  1. Paint paint=new Paint();
  2. paint.setColor(Color.RED);  //设置画笔颜色
  3. paint.setStyle(Style.FILL);//设置填充样式
  4. paint.setStrokeWidth(15);//设置画笔宽度
  5. canvas.drawRect(10, 10, 100, 100, paint);//直接构造
  6. RectF rect = new RectF(120, 10, 210, 100);
  7. canvas.drawRect(rect, paint);//使用RectF构造
  8. Rect rect2 =  new Rect(230, 10, 320, 100);
  9. canvas.drawRect(rect2, paint);//使用Rect构造

7、圆角矩形

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

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

  1. Paint paint=new Paint();
  2. paint.setColor(Color.RED);  //设置画笔颜色
  3. paint.setStyle(Style.FILL);//设置填充样式
  4. paint.setStrokeWidth(15);//设置画笔宽度
  5. RectF rect = new RectF(100, 10, 300, 100);
  6. canvas.drawRoundRect(rect, 20, 10, paint);

8、圆形

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

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

  1. Paint paint=new Paint();
  2. paint.setColor(Color.RED);  //设置画笔颜色
  3. paint.setStyle(Style.FILL);//设置填充样式
  4. paint.setStrokeWidth(15);//设置画笔宽度
  5. canvas.drawCircle(150, 150, 100, paint);

9、椭圆

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

void drawOval (RectF oval, Paint paint)

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

  1. Paint paint=new Paint();
  2. paint.setColor(Color.RED);  //设置画笔颜色
  3. paint.setStyle(Style.STROKE);//填充样式改为描边
  4. paint.setStrokeWidth(5);//设置画笔宽度
  5. RectF rect = new RectF(100, 10, 300, 100);
  6. canvas.drawRect(rect, paint);//画矩形
  7. paint.setColor(Color.GREEN);//更改画笔颜色
  8. canvas.drawOval(rect, paint);//同一个矩形画椭圆

10、弧

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

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)将画笔设为描边,效果:

  1. Paint paint=new Paint();
  2. paint.setColor(Color.RED);  //设置画笔颜色
  3. paint.setStyle(Style.STROKE);//填充样式改为描边
  4. paint.setStrokeWidth(5);//设置画笔宽度
  5. RectF rect1 = new RectF(100, 10, 300, 100);
  6. canvas.drawArc(rect1, 0, 90, true, paint);
  7. RectF rect2 = new RectF(400, 10, 600, 100);
  8. canvas.drawArc(rect2, 0, 90, false, paint);


(二)、将画笔设为填充

  1. Paint paint=new Paint();
  2. paint.setColor(Color.RED);  //设置画笔颜色
  3. paint.setStyle(Style.FILL);//填充样式改为描边
  4. paint.setStrokeWidth(5);//设置画笔宽度
  5. RectF rect1 = new RectF(100, 10, 300, 100);
  6. canvas.drawArc(rect1, 0, 90, true, paint);
  7. RectF rect2 = new RectF(400, 10, 600, 100);
  8. canvas.drawArc(rect2, 0, 90, false, paint);

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

源码下载地址:http://download.csdn.net/detail/harvic880925/7834517请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/38875149 谢谢!

android Graphics(一):概述及基本几何图形绘制的更多相关文章

  1. android Graphics类:概述及基本几何图形绘制

    当须要在Android上绘制图形时.就会用到Graphics类.Paint类.Paint就是相当于笔,而Canvas就是 纸.这里叫画布. 所以,凡有跟要要画的东西的设置相关的.比方大小,粗细,画笔颜 ...

  2. 【转】android Graphics(四):canvas变换与操作

    android Graphics(四):canvas变换与操作 分类: 5.andriod开发2014-09-05 15:05 5877人阅读 评论(18) 收藏 举报   目录(?)[+]   前言 ...

  3. android Graphics(四):canvas变换与操作

    前言:前几篇讲解了有关canvas绘图的一些操作,今天更深入一些,讲讲对画布的操作,这篇文章不像前几篇那么容易理解,如果以前没有接触过画布的童鞋可能比较难以理解,为什么会这样.我尽量多画图,让大家更清 ...

  4. android Graphics(三):区域(Range)

    前言:最近几天对画图的研究有些缓慢,项目开始写代码了,只能在晚上空闲的时候捯饬一下自己的东西,今天给大家讲讲区域的相关知识,已经想好后面两篇的内容了,这几天有时间赶紧写出来给大家.有关界面开发的东东内 ...

  5. android Graphics(二):路径及文字

    前言:今天项目进入攻关期,他们改Bug要改疯掉了,主管为了激励大家,给大家发了一封邮件,讲到他对项目和学习的理解,一个很好的图形模型,分享给大家,如图在下面给出:(不便给出原文,我仅做转述)无论是学习 ...

  6. android.graphics(1) - Paint, Canvas, drawLine, drawPoint, drawRect, drawRoundRect, drawCircle, drawOval, drawArc

    一.Paint与Canvas 像我们平时画图一样,需要两个工具,纸和笔.Paint就是相当于笔,而Canvas就是纸,这里叫画布. 所以,凡有跟要要画的东西的设置相关的,比如大小,粗细,画笔颜色,透明 ...

  7. Android自定控件基础(一)——几何图形绘制

    虽然本人有几年开发经验,但是自定义控件这一块儿,研究的很少,惭愧--用到的时候就是百度查找,复制粘贴.工时紧,总是想的快点完工就好.(都是借口啦,想学总会有时间哒) 作为一个Android开发 要说自 ...

  8. 使用android.graphics.Path类自绘制PopupWindow背景

    PopupWindow简单介绍 PopupWindow是悬浮在当前activity上的一个容器,用它能够展示随意的内容. PopupWindow跟位置有关的API有以下几个: showAsDropDo ...

  9. 【Android】3.18 示例18--自定义绘制功能

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 简介:介绍自定义绘制点.线.多边形.圆等几何图形和文字 详述: (1)支持绘制凸多边形,如要绘制凹多边形请用三 ...

随机推荐

  1. 浅谈Struts2(二)

    一.struts2的跳转 1.action跳转JSP a.默认为forward <action name="action1" class="com.liquidxu ...

  2. NOIP2010提高组] CODEVS 1069 关押罪犯(并查集)

    这道这么简单的题目还写了这么久.. 将每个会发生冲突的两人的怒气进行排序,然后从怒气大到小,将两个人放到不同监狱中.假如两人都已经被放置且在同一监狱,这就是答案. ------------------ ...

  3. 关于LZO和LZOP

    LZO  是一个适合实时解压.压缩的压缩库 LZOP 基于LZO库的压缩解压工具   PS:有了压缩解压库LZO,还不能直接操作文件压缩解压,需要LZOP   下载的话直接google吧~~~  

  4. 未能从程序集“System.ServiceModel,xxx”中加载类型“System.ServiceModel.Activation.HttpModule”。

    一.平台环境 二.问题描述 未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561 ...

  5. 微信开发_微信教程__微信通讯框架V1.0

    做个广告先, PHP千人群(6848027) C++群 (1414577) 看雪汇编&反汇编群(15375777) 看雪汇编&反汇编2群(4915800) 转载不一定注明出处,只要推荐 ...

  6. MVC-03 控制器(1)

    Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并且负责协调Model与View之间的数据传递,是ASP.NET MVC整体运作的核心角色. 一.关于Con ...

  7. SSH 配置日记

    1   注意struts2-spring-plugin.jar的导入.    Unable to load configuration. - action  异常.需要导入这个包 2  很久都跑不通的 ...

  8. [编程语言][java][java se]java泛型中? T K V E含义(学习)

    ? 表示不确定的java类型,类型是未知的. T  表示java类型. K V 分别代表java键值中的Key Value. E 代表Element,特性是枚举. 1.意思     jdk中的K,V, ...

  9. android使用全局变量的两种方法

         在我们使用android编写程序的时候,少不了想利用全局变量,但是面向对象语言和过程语言区别很大,不再是include就可以的.这里我写了使用全局变量的两种方法: 1.使用applicati ...

  10. 发一个讨论帖,如果结果被采纳的话可以给一份adb 代码,以及我封装的ADBLIB

    如何在手机没有root 的情况下,获取系统的一些文件,比如 /data/data/xxxx 目录下的文件. 有任何想法的请说出来.