澳门金沙国际 1

一种类作品之
Android中自定义View(一)
洋洋洒洒文章之
Android中自定义View(二)
多如牛毛文章之
Android中自定义View(三)
多重小说之
Android中自定义View(四)
多元文章之
Android中自定义View(xml绘图)
本文来源:
http://www.jianshu.com/u/a1251e598483

作者:扔物线

 

线上箭头表示画线的倾向。WINDING格局和ALTERNATE方式都会填充多少个封闭的L型区域,号码从1到3。多个更小的内部区域,号码为4和5,在ALTERNATE方式下不被填充。不过在WINDING形式下,号码5的区域会被填充,那是因为区域的里边到达图形的外部必须通过两条相同方向的线。号码为4的区域不会被填充,因为射线必须越过两条边框线,可是那两条边框线的绘图方向相反。

大家在使用种种App时都会见到众多精粹的效果,说实话有的职能的确很狼狈,所以觉得能写出这一个功用的人都好狠心的说,自定义View
在Android 进阶相关的书本中都是必会内容,我也一贯看过大致的自定义View
的内容,看过将来依然认为不够详细,上手依旧抓瞎. 刚好网上 扔物线 大神
写了一个自定义view 的详细教程.
http://hencoder.com/ui-1-1/
.倘使想上学自定义View的同窗请去 大神那里围观,本文是记录自己上学
自定义View 的知道和获取,也是一个笔录吧,等到用的时候比较不难找到.

链接:

大家平日会创立折线图表来表述一个进度的主旋律变化,而一旦让折线图动起来,会愈发的鲜活。接下来大家将一步步通过图解的形式完毕这一办法

澳门金沙国际 2澳门金沙国际 3

自家是分割线,下边开端本文内容————————–

自定义View分为以下多少个部分

  • Canvas 的 drawXXX() 体系措施及 Paint 最广大的应用
  • Paint 的一心攻略
  • Canvas 对绘制的接济——范围裁切和几何变换。
  • 采用不一致的绘图方法来支配绘制顺序

来源:掘金

今昔我们来拓展操作:

  1 /*-------------------------------------------
  2 ALTWIND.C -- Alternate and Winding Fill Modes
  3              (c) Charles Petzold, 1998
  4 -------------------------------------------*/
  5 
  6 #include <Windows.h>
  7 
  8 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  9 
 10 int WINAPI WinMain( __in HINSTANCE hInstance
 11                     , __in_opt HINSTANCE hPrevInstance
 12                     , __in LPSTR lpCmdLine
 13                     , __in int nShowCmd )
 14 {
 15     static TCHAR szAppName[] = TEXT("AltWind");
 16     HWND hwnd;
 17     MSG msg;
 18     WNDCLASS wndclass;
 19 
 20     wndclass.style = CS_HREDRAW | CS_VREDRAW;
 21     wndclass.lpfnWndProc = WndProc;
 22     wndclass.cbClsExtra = 0;
 23     wndclass.cbWndExtra = 0;
 24     wndclass.hInstance = hInstance;
 25     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 26     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
 27     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 28     wndclass.lpszMenuName = NULL;
 29     wndclass.lpszClassName = szAppName;
 30 
 31     if (!RegisterClass(&wndclass))
 32     {
 33         MessageBox(NULL, TEXT("Program requires Windows NT!")
 34             , szAppName, MB_ICONERROR);
 35         return 0;
 36     }
 37 
 38     hwnd= CreateWindow(szAppName, TEXT("Alternate and Winding Fill Modes")
 39         , WS_OVERLAPPEDWINDOW
 40         , CW_USEDEFAULT, CW_USEDEFAULT
 41         , CW_USEDEFAULT, CW_USEDEFAULT
 42         , NULL, NULL, hInstance, NULL);
 43 
 44     ShowWindow(hwnd, nShowCmd);
 45     UpdateWindow(hwnd);
 46 
 47     while (GetMessage(&msg, NULL, 0, 0))
 48     {
 49         TranslateMessage(&msg);
 50         DispatchMessage(&msg);
 51     }
 52 
 53     return msg.wParam;
 54 }
 55 
 56 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 57 {
 58     static POINT aptFigure[10] = {10, 70
 59                                 , 50, 70
 60                                 , 50, 10
 61                                 , 90, 10
 62                                 , 90, 50
 63                                 , 30, 50
 64                                 , 30, 90
 65                                 , 70, 90
 66                                 , 70, 30
 67                                 , 10, 30};
 68     static int cxClient, cyClient;
 69     HDC hdc;
 70     int i;
 71     PAINTSTRUCT ps;
 72     POINT apt[10];
 73 
 74     switch (message)
 75     {
 76     case WM_SIZE:
 77         cxClient = LOWORD(lParam);
 78         cyClient = HIWORD(lParam);
 79         return 0;
 80 
 81     case WM_PAINT:
 82         hdc = BeginPaint(hwnd, &ps);
 83         SelectObject(hdc, GetStockObject(GRAY_BRUSH));
 84 
 85         for (i = 0; i !=10; ++i)
 86         {
 87             apt[i].x = cxClient * aptFigure[i].x / 200;
 88             apt[i].y = cyClient * aptFigure[i].y / 100;
 89         }
 90         SetPolyFillMode(hdc, ALTERNATE);
 91         Polygon(hdc, apt, 10);
 92 
 93         for (i = 0; i != 10; ++i)
 94         {
 95             apt[i].x += cxClient / 2;
 96         }
 97         SetPolyFillMode(hdc, WINDING);
 98         Polygon(hdc, apt, 10);
 99 
100         EndPaint(hwnd, &ps);
101         return 0;
102 
103     case WM_DESTROY:
104         PostQuitMessage(0);
105         return 0;
106     }
107 
108     return DefWindowProc(hwnd, message, wParam, lParam);
109 }
今天那篇就是第一有的:Canvas 的 drawXXX() 系列措施及 Paint 最广大的运用

澳门金沙国际 4

自定义View 继承View 四个构造方法,重写 onDraw() 方法

Paint paint = new Paint();

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);    // 绘制一个圆
    canvas.drawCircle(300, 300, 200, paint);
}
  1. Canvas 类下的所有 draw- 打头的主意,例如 drawCircle() drawBitmap()。
  2. Paint 类的多少个最常用的措施。具体是:
  • Paint.setStyle(Style style) 设置绘制方式
  • Paint.setColor(int color) 设置颜色
  • Paint.setStrokeWidth(float width) 设置线条宽度
  • Paint.setTextSize(float textSize) 设置文字大小
  • Paint.setAntiAlias(boolean aa) 设置抗锯齿开关

上代码

澳门金沙国际 5

设置paint 然后画出一个圆

canvas 可以画出累累浩大事物,我们可以在google的合法文档上查看所有办法
上链接
https://developer.android.google.cn/reference/android/graphics/Canvas.html

澳门金沙国际 6

官方文档上相继艺术

PowerPoint2010落实折线图动态显示,绘图基础。奇迹吧也不太情愿看文档,因为文档上写的真他妈的多,但是该看的时候也迟早要看,上图的一一艺术都是可以点击进入的,方法的详实介绍及利用都有.
即使您真的看的下去你就去看文档吧,我毫不拦你,可是没人一个一个方法点进去看,因为常用的就那一个,接下去自己把常用的多个格局列出来给大家看看.

文章权归小编所有。商业转发请联系作者获得授权,非商业转载请评释出处。

开行PPT,新建一个空白幻灯片

ALTWIND.C

Canvas.drawColor(@ColorInt int color) 颜色填充

在整体绘制区域联合涂上指定的颜色。

比如说 drawColor(Color.BLACK) 会把整个区域染成纯黄色,覆盖掉原有内容;
drawColor(Color.parse(“#88880000”)
会在原本的绘图效果上加一层半晶莹剔透的粉色遮罩。
接近的章程还有 drawRGB(int r, int g, int b) 和 drawARGB(int a, int r,
int g, int b) ,它们和 drawColor(color)
只是应用方法各异,效能都是一样的。

Paint类的几个最常用的法子。具体是:

澳门金沙国际 7

图表的坐标(按一个100*100单位的区域设定)存储在aptFigure数组中。这一个坐标会依照客户去的小幅和惊人按百分比缩放。程序突显两个图形,一个用到ALTERNATE填充方式,另一个使用WINDING填充形式。结果如图:

drawCircle(float centerX, float centerY, float radius, Paint paint) 画圆

前七个参数 centerX centerY 是圆心的坐标,第一个参数 radius
是圆的半径,单位都是像素,它们一起组成了那么些圆的为主新闻(即用那多少个新闻方可构建出一个规定的圆);第七个参数
paint,它提供基本音讯之外的保有风格信息,例如颜色、线条粗细、阴影等。

在 Android 里,每个 View
都有一个自己的坐标系,互相之间是不影响的。这些坐标系的原点是 View
左上角的非凡点;水平方向是 x 轴,右正左负;竖直方向是 y
轴,下正上负(注意,是下正上负,不是上正下负,和学习时候学的坐标系方向不雷同)。也就是下面那些样子。

澳门金沙国际 8

image.png

从而一个 View 的坐标 (x, y) 处,指的就是对峙它的左上角这些点的水准方向 x
像素、竖直方向 y 像素的点。例如,(300, 300) 指的就是左上角的点向右 300
、向下 300 的职位; (100, -50) 指的就是左上角的点向右 100 、向上 50
的岗位。

好了坐标系插播截止,接着插播 paint 方法

1.Paint.setStyle(Style style)设置绘制情势

陈设一个折线图

澳门金沙国际 9

插播一: Paint.setColor(int color)

譬如说,你要画一个革命的圆,并不是写成 canvas.drawCircle(300, 300, 200,
RED, paint)
如此那般,而是像上边那样:
paint.setColor(Color.RED); // 设置为革命canvas.drawCircle(300, 300, 200,
paint);

澳门金沙国际 10

Paint.setColor(int color)是
Paint最常用的方法之一,用来安装绘制内容的颜料。你不断能够用它画绿色的圆,也得以用它来画粉红色的矩形、黄色的五角星、红色的文字。

setStyle(Style
style)那些办法设置的是绘制的Style。Style具体来说有三种:FILL,STROKE和FILL_AND_STROKE。FILL是填写格局,STROKE是画线形式(即勾边形式),FILL_AND_STROKE是三种形式一并应用:既画线又填充。它的默许值是FILL,填充情势。

澳门金沙国际 11

插播二: Paint.setStyle(Paint.Style style)

而只要您想画的不是拳拳圆,而是空心圆(或者叫环形),也可以选用paint.setStyle(Paint.Style.STROKE)
来把绘制形式改为画线形式。
paint.setStyle(Paint.Style.STROKE); // Style
修改为画线情势canvas.drawCircle(300, 300, 200, paint);

澳门金沙国际 12

setStyle(Style style) 那么些格局设置的是绘制的 Style 。Style
具体来说有三种: FILL, STROKE和
FILL_AND_STROKE。FILL是填充情势,STROKE是画线方式(即勾边形式),FILL_AND_STROKE是三种格局一并选取:既画线又填充。它的默许值是
FILL,填充形式。

2.Paint.setColor(int color)设置颜色

并发以下界面

插播三: Paint.setStrokeWidth(float width)

在 STROKE和 FILL_AND_STROKE下,还足以接纳 paint.setStrokeWidth(float
width)来安装线条的幅度:paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(20);
// 线条宽度为 20 像素canvas.drawCircle(300, 300, 200, paint);

3.Paint.setStrokeWidth(float width)设置线条宽度

澳门金沙国际 13

插播四: 抗锯齿

在绘制的时候,往往要求打开抗锯齿来让图形和文字的边缘越发平缓。开启抗锯齿很简短,只要在
new Paint()的时候添加一个 ANTI_ALIAS_FLAG参数就行:Paint paint = new
Paint(Paint.ANTI_ALIAS_FLAG);

其它,你也足以拔取 Paint.setAntiAlias(boolean
aa)来动态开关抗锯齿。抗锯齿的听从如下:

澳门金沙国际 14

可以观看,没有打开抗锯齿的时候,图形会有毛片现象,啊不,毛边现象。所以一定记得要打开抗锯齿哟!

在STROKE和FILL_AND_STROKE下,还足以使用paint.setStrokeWidth(float
width)

修改其中的数量,为了显得雅观,尽量让X轴方向数据多或多或少澳门金沙国际 15

除此之外圆,Canvas 仍可以绘制一些其余不难图形。它们的选取方法和 drawCircle() 安庆小异,我就只对它们的 API 做简单的介绍.

4.Paint.setTextSize(float textSize)设置文字大小

大家先进行部分鼓吹

drawRect(float left, float top, float right, float bottom, Paint paint) 画矩形

left, top, right, bottom 是矩形四条边的坐标。
除此以外,它还有七个重载方法 drawRect(RectF rect, Paint paint) 和
drawRect(Rect rect, Paint paint) ,让你可以直接填写 RectF 或 Rect
对象来绘制矩形。

5.Paint.setAntiAlias(boolean aa)设置抗锯齿开关

隐藏纵坐标轴、隐藏横坐标轴刻度线

drawPoint(float x, float y, Paint paint) 画点

x 和 y 是点的坐标。点的大小可以经过 paint.setStrokeWidth(width)
来安装;点的形状可以因此 paint.setStrokeCap(cap) 来设置:ROUND
画出来是圈子的点,SQUARE 或 BUTT 画出来是方形的点。

在绘制的时候,往往必要打开抗锯齿来让图形和文字的边缘更加平滑.别的,还是可以在开立Paint对象的时候,直接设置抗锯齿

对此均匀分布的折线图数据点来说,每个数据点的横向分布地点绝对相比较便于辨认,因而纵向网格线的视觉引导并非完全必须,所以折线图可以挑选使用纵横网格线的背景区域,也得以隐藏纵向网格线和纵坐标轴,仅突显横向网格线来标识数据高度。

drawPoints(float[] pts, int offset, int count, Paint paint) / drawPoints(float[] pts, Paint paint) 画点(批量)

相同是画点,它和 drawPoint() 的不一致是足以画两个点。pts
那么些数组是点的坐标,每五个成一对;offset
表示跳过数组的前几个数再开头记坐标;count 表示一共要绘制多少个点
float[] points = {0, 0, 50, 50, 50, 100, 100, 50, 100, 100, 150, 50,
150, 100};
// 绘制四个点:(50, 50) (50, 100) (100, 50) (100, 100)
canvas.drawPoints(points, 2 /* 跳过多个数,即前多个 0 /, 4 /
一共绘制八个点*/, paint);

澳门金沙国际 16

Paint    paint  =   new   Paint(Paint.ANTI_ALIAS_FLAG);

入选纵坐标轴,设置坐标轴格式,在填充线条中挑选【无线条】

drawOval(float left, float top, float right, float bottom, Paint paint) 画椭圆

不得不绘制横着的或者竖着的扁圆形,不可以绘制斜的 left, top, right, bottom
是其一椭圆的左、上、右、下多个边界点的坐标。
除此以外,它还有一个重载方法 drawOval(RectF rect, Paint
paint),让您可以平素填写 RectF 来绘制椭圆。

因为抗锯齿的规律是:修改图形边缘处的像素颜色,从而让图形在眼睛看来具有尤其平整的感觉

当选横坐标轴,设置坐标轴格式,刻度线标记类型设置为【无】

drawLine(float startX, float startY, float stopX, float stopY, Paint paint) 画线

startX, startY, stopX, stopY 分别是线的起源和终极坐标。

二、绘图Api

澳门金沙国际 17

drawLines(float[] pts, int offset, int count, Paint paint) / drawLines(float[] pts, Paint paint) 画线(批量)

drawLines() 是 drawLine() 的复数版。
float[] points2 =
{100,500,300,500,100,800,500,800,100,500,100,800,300,500,500,800};
canvas.drawLines(points2,paint);

1.canvas.drawColor(@ColorInt int color) 颜色填充

澳门金沙国际 18

drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) 画圆角矩形

left, top, right, bottom 是四条边的坐标,rx 和 ry
是圆角的横向半径和纵向半径。

drawColor(Color.BLACK)会把全副区域染成纯粉黑色,覆盖掉原有内容;

澳门金沙国际 19

drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 绘制弧形或扇形

drawArc() 是使用一个椭圆来叙述弧形的。left, top, right, bottom
描述的是其一弧形所在的椭圆;startAngle 是弧形的开场角度(x
轴的正向,即正右的大方向,是 0
度的岗位;顺时针为正角度,逆时针为负角度),sweepAngle
是弧形划过的角度;useCenter
表示是不是连接到圆心,假设不连接受圆心,就是弧形,即便总是到圆心,就是扇形。
paint.setStyle(Paint.Style.FILL); // 填充形式
canvas.drawArc(200, 100, 800, 500, -110, 100, true, paint); //
绘制扇形
canvas.drawArc(200, 100, 800, 500, 20, 140, false, paint); // 绘制弧形
paint.setStyle(Paint.Style.STROKE); // 画线格局
canvas.drawArc(200, 100, 800, 500, 180, 60, false, paint); //
绘制不封口的拱形

澳门金沙国际 20

drawColor(Color.parse(“#88880000”)会在原来的绘图效果上加一层半晶莹剔透的藏黑色遮罩。

简化横轴标签

到此甘休,以上就是 Canvas 所有的简易图形的绘图。除了简单图形的绘图, Canvas 还是能运用 drawPath(Path path) 来绘制自定义图形。

2.canvas.drawCircle(float centerX, float centerY, float radius, Paint
paint) 画圆

折线图由于横轴上分布的数据点相对来说会相比较多,因而数据标签的分布密度相相比较较高,也经过须求标签的内容尽可能不难,可以透过修改数据标签的数值格式来举行简化(如若是文字标签指出直接更改源数据),也得以考虑通过松开坐标间隔单位来收缩标签的来得数量

drawPath(Path path, Paint paint) 画自定义图形

path.addArc(200, 1200, 400, 1400, 135, 225);
path.arcTo(400, 1200, 600, 1400, 180, 225, false);
path.lineTo(400, 1500);

canvas.drawPath(path, paint); //记得改一下画笔的颜料和填充;

澳门金沙国际 21

画一个慈善送给女对象是否浪

Path
可以描述直线、二次曲线、一次曲线、圆、椭圆、弧形、矩形、圆角矩形。把这个图片组成起来,就可以描述出比比皆是错综复杂的图样。上面我就说一下有血有肉的怎么把这几个图片描述出来。

Path 有两类措施,一类是直接描述路径的,另一类是扶持的装置或总括。

centerX,centerY 是圆心坐标,radius是半径

当选横坐标轴,设置坐标轴格式,更改数字格式类型,例如将日期改为m/d的格式。

Path 方法第一类:间接描述路径。

3.canvas.drawRect(RectF rect, Paint paint) 画矩形  
是独具包容性的,一般我爱不释手用这些

大家那边不做处理

先是组: addXxx() ——添加子图形

addCircle(float x, float y, float radius, Direction dir) 添加圆

x, y, radius 那多个参数是圆的主干信息,最终一个参数 dir
是画圆的门路的取向。
顺时针 (CW clockwise) 和逆时针 (CCW counter-clockwise)

RectF   rect   =  new
RectF(100,100,300,300);分别代表左上点的坐标和右下点的坐标,构成一个矩形

其他因素设置

其次组:xxxTo() ——画线(直线或曲线)

这一组和第一组 addXxx() 方法的分别在于,第一组是加上的完全封闭图形(除了
addPath() ),而这一组添加的只是一条线。

lineTo(float x, float y) / rLineTo(float x, float y) 画直线

从近期岗位向目的地点画一条直线, x 和 y
是目的地点的坐标。那七个方式的界别是,lineTo(x, y) 的参数是纯属坐标,而
rLineTo(x, y) 的参数是相对当前义务的周旋坐标 (前缀 r 指的就是
relatively 「绝对地」)。

paint.setStyle(Style.STROKE);
path.lineTo(100, 100); // 由近来岗位 (0, 0) 向 (100, 100) 画一条直线
path.rLineTo(100, 0); // 由近年来职分 (100, 100) 向正右方 100
像素的职务画一条直线

澳门金沙国际 22

这就是lineTo 和人LineTo的区别

4.canvas.drawPoint(float x, float y, Paint paint) 画点

网格线背景在图片中是配角,在不影响数值定位的气象下得以尽可能淡化横向网格线,别的图表区域和制图区域的背景填充色也都得以安装为无色透明,裁减对前景的显示影响

quadTo(float x1, float y1, float x2, float y2) / rQuadTo(float dx1, float dy1, float dx2, float dy2) 画二次贝塞尔曲线

那条二次贝塞尔曲线的起源就是当前岗位,而参数中的 x1, y1 和 x2, y2
则分别是控制点和极端的坐标。和 rLineTo(x, y) 同理,rQuadTo(dx1, dy1,
dx2, dy2) 的参数也是对峙坐标
实际怎么是 贝塞尔曲线 请看这篇扫盲贴
http://www.html-js.com/article/1628

点的尺寸可以经过paint.setStrokeWidth(width)来安装;点的模样可以透过paint.setStrokeCap(cap)来设置:ROUND画出来是圈子的点,SQUARE或BUTT画出来是方形的点。

当选网格线,设置形状概况颜色为浅黄色。分别入选绘图区域和图纸区域,填充色都设置为【无颜色】

cubicTo(float x1, float y1, float x2, float y2, float x3, float y3) / rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 画一次贝塞尔曲线

和地点这么些 quadTo() rQuadTo() 的二次贝塞尔曲线同理,cubicTo() 和
rCubicTo() 是一回别塞尔曲线。

Paint.Cap.ROUND    圆形的点

澳门金沙国际 23

澳门金沙国际,moveTo(float x, float y) / rMoveTo(float x, float y) 移动到对象地方

不论是直线仍旧贝塞尔曲线,都是以如今岗位作为起源,而不可能指定源点。但你可以通过
moveTo(x, y) 或 rMoveTo() 来改变近日地点,从而直接地设置那几个格局的起源。

path.lineTo(100, 100); // 画斜线 
path.moveTo(200, 100); // 我移~~
path.lineTo(200, 0); // 画竖线

澳门金沙国际 24

moveTo(x, y)
固然不添加图形,但它会安装图形的起源,所以它是优异关键的一个赞助方法。

其余,第二组还有四个卓越的措施: arcTo() 和
addArc()。它们也是用来画线的,但并不采取当前地方作为弧线的起源。

Paint.Cap.SQUARE       /       Paint.Cap.BUTT  放形的点

字体优化

arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(RectF oval, float startAngle, float sweepAngle) 画弧形

这么些方法和 Canvas.drawArc() 比起来,少了一个参数
useCenter,而多了一个参数 forceMoveTo 。

少了 useCenter ,是因为 arcTo() 只用来画弧形而不画扇形,所以不再须要useCenter 参数;而多出来的那些 forceMoveTo
参数的情趣是,绘制是要「抬一下笔移动过去」,仍然「直接拖着笔过去」,不同在于是或不是留下移动的痕迹。

5.canvas.drawPoints(float[] pts, int offset, int count, Paint paint)
 四次性的化多个点

安装字体,本例中选拔英文字体为Candara,汉语字体为微软雅黑。

addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle) / addArc(RectF oval, float startAngle, float sweepAngle)

又是一个半圆的主意。一个叫 arcTo ,一个叫
addArc(),都是弧形,不相同在哪个地方?其实很简短: addArc() 只是一个直接行使了
forceMoveTo = true 的简化版 arcTo() 。

pts那几个数组是点的坐标,每七个成一对;offset代表跳过数组的前多少个数再初始记坐标;count表示一共要绘制多少个点。

优化形状

close() 封闭当前子图形

它的成效是把当下的子图形封闭,即由近期地方向当前子图形的源点绘制一条直线。

6.canvas.drawPoints(float[] pts, Paint paint) 画点(批量)

崛起折线图中的数据点突显,同时与数码连线和谐搭配。常见的点子是选项采纳圆形的多少符号,放大形状,设置一定差其他填写和边框色。

paint.setStyle(Style.STROKE); path.moveTo(100, 100); path.lineTo(200, 100); path.lineTo(150, 150); path.close(); // 使用 close() 封闭子图形。等价于 path.lineTo(100, 100)

澳门金沙国际 25

close()和 lineTo(起源坐标)是全然等价的。

pts那一个数组是点的坐标,每八个成一对;

入选数据序列,设置数据体系格式,在数额符号选项中甄选置于的圈子形状,调整大小,例如设置为11

Path 方法第二类:支持的安装或总计

7.canvas.drawOval(RectF rect, Paint paint)画椭圆

澳门金沙国际 26

Path.setFillType(Path.FillType ft) 设置填充方式

眼前在说 dir 参数的时候关系, Path.setFillType(fillType)
是用来设置图形自相交时的填充算法的:
方法中填入分化的 FillType 值,就会有两样的填充效果。FillType
的取值有四个:

  • EVEN_ODD
  • WINDING (默认值)
  • INVERSE_EVEN_ODD
  • INVERSE_WINDING

RectF  是矩形,其实就是确定在一个矩形里面画一个椭圆

设置数据符号的填充色和边框线

EVEN_ODD 和 WINDING 的原理

即 even-odd rule
(奇偶原则):对于平面中的任意一点,向自由方向射出一条射线,那条射线和图表相交的次数(相交才算,相切不算哦)如果是奇数,则那些点被认为在图纸内部,是要被涂色的区域;若是是偶数,则那些点被认为在图纸外部,是不被涂色的区域。还以左右相交的双圆为例:

澳门金沙国际 27

WINDING
即 non-zero winding rule (非零环绕数原则)
率先,它要求你图形中的所有线条都是有绘制方向的:

澳门金沙国际 28

下一场,同样是从平面中的点向任意方向射出一条射线,但总括规则分歧:以 0
为发轫值,对于射线和图片的具有交点,境遇每个顺时针的交点(图形从射线的左边向右穿过)把结果加
1,境遇每个逆时针的交点(图形从射线的入手向左穿过)把结果减
1,最后把具有的交点都算上,得到的结果如果不是
0,则认为这么些点在图纸内部,是要被涂色的区域;假设是
0,则以为那几个点在图纸外部,是不被涂色的区域。

澳门金沙国际 29

因此,完整版的 EVEN_ODD
和 WINDING
的听从应该是那样的:

澳门金沙国际 30

而 INVERSE_EVEN_ODD和 INVERSE_WINDING,只是把那二种效应进行反转而已。

8.canvas.drawLine(float startX, float startY, float stopX, float stopY,
Paint paint) 画线

可以考虑将数据符号的填充色设置为白色,而设置边框线颜色与数据点连线保持一致,并且加大边框线宽度,与数据点连线保持一致

drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 画 Bitmap

它的重载方法:

drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) /
drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) /
drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)

float startX, float startY   起始点

当选数据种类,设置数据连串格式,设置数据符号的填充色,设置数据符号的边框线颜色和线型宽度。

drawText(String text, float x, float y, Paint paint) 绘制文字

界面里富有的浮现内容,都是绘制出来的,包蕴文字。 drawText()
那么些措施就是用来绘制文字的。参数 text 是用来绘制的字符串,x 和 y
是绘制的源点坐标。
经过 Paint.setTextSize(textSize),可以设置文字的尺寸。
差不离 canvas的常用方法说完了,接下去就是Paint了.

float stopX, float stopY  终止点

暂不做拍卖

9.canvas.drawLines(float[] pts, int offset, int count, Paint paint)
 批量画线

 

10.canvas.drawRoundRect(RectF rect, float rx, float ry, Paint paint)
 画圆角的矩形

加上擦除动画

RectF rect   规定一个矩形

澳门金沙国际 31

float rx, float ry   圆角矩形的圆角的横向半径和纵向半径

再右键单击动画,在【效果选项】里对【图表动画】进行安装,拔取【按分类】(一段一段出现,【按体系】是整条线出现)

11.canvas.drawArc(float left, float top, float right, float bottom,
float startAngle, float sweepAngle, boolean useCenter, Paint paint)
绘制弧形或扇形

澳门金沙国际 32

drawArc()是使用一个椭圆来叙述弧形的。left,top,right,bottom描述的是其一弧形所在的椭圆;

调剂方向,将背景设置为【自尾部】,分类1到12安装为【自右侧】(选用分类1,按住【Shift】,接纳分类12,即可全选),此外索要将播放调整为【从上一项之后先河】

startAngle是弧形的苗子角度(x 轴的正向,即正右的来头,是 0
度的任务;顺时针为正角度,逆时针为负角度),

澳门金沙国际 33

sweepAngle是弧形划过的角度;

澳门金沙国际 34

useCenter表示是还是不是连接到圆心,假设不连接受圆心,就是弧形,假使总是到圆心,就是扇形。

澳门金沙国际 35

12.canvas.drawPath(Path path, Paint paint) 画自定义图形

说到底适当调整时间进程即可

drawPath(path)这一个法子是经过讲述路径的艺术来绘制图形的,它的path参数就是用来叙述图形路径的对象。path的体系是Path

三、Path 相关绘制方法与认证

Path   path =  new   Path();

………..path的连锁措施

最后别忘记:canvas.drawPath(path,paint);

1.path.addCircle(float x, float y, float radius, Direction dir) 添加圆

参数dir是画圆的门道的动向

顺时针 (CWclockwise) 和逆时针 (CCWcounter-clockwise)
。对于一般情形,那几个参数填CW如故填CCW没有影响。它只是在要求填写图形(Paint.Style为FILL或FILL_AND_STROKE)
,并且图表现身自相交时,用于判断填充范围的

2.path.addOval(float left, float top, float right, float bottom,
Direction dir) / addOval(RectF oval, Direction dir) 添加椭圆

3.path.addRect(float left, float top, float right, float bottom,
Direction dir) / addRect(RectF rect, Direction dir) 添加矩形

4.path.addRoundRect(RectF rect, float rx, float ry, Direction dir) /
addRoundRect(float left, float top, float right, float bottom, float rx,
float ry, Direction dir) / addRoundRect(RectF rect, float[] radii,
Direction dir) / addRoundRect(float left, float top, float right, float
bottom, float[] radii, Direction dir) 添加圆角矩形

5.path.addPath(Path path) 添加另一个 Path

6.path.lineTo(float x, float y) / rLineTo(float x, float y) 画直线

脚下职责向目的地点画一条直线,x和y是目的地方的坐标。那多个方法的区分是,lineTo(x,
y)的参数是相对坐标,而rLineTo(x,
y)的参数是相对当前义务的周旋坐标(前缀r指的就是relatively「相对地」)。

眼前岗位:所谓当前岗位,即最终两回调用画Path的点子的终点地点。初步值为原点
(0, 0)。

7.path.quadTo(float x1, float y1, float x2, float y2) / rQuadTo(float
dx1, float dy1, float dx2, float dy2) 画二次贝塞尔曲线

那条二次贝塞尔曲线的源点就是时下岗位,而参数中的x1,y1和x2,y2则分别是控制点和终点的坐标。和rLineTo(x,
y)同理,rQuadTo(dx1, dy1, dx2, dy2)的参数也是相对坐标

8.path.cubicTo(float x1, float y1, float x2, float y2, float x3, float
y3) / rCubicTo(float x1, float y1, float x2, float y2, float x3, float
y3) 画四遍贝塞尔曲线

9.path.moveTo(float x, float y) / rMoveTo(float x, float y)
移动到对象地点,可以指定起源

无论是直线依然贝塞尔曲线,都是以当下义务作为源点,而不能够指定起源。但你可以透过moveTo(x,
y)或rMoveTo()来改变近年来岗位,从而直接地设置那些主意的起源。

moveTo(x,
y)即使不添加图形,但它会安装图形的源点,所以它是极度首要的一个扶持方法。

10.path.arcTo(RectF oval, float startAngle, float sweepAngle, boolean
forceMoveTo) / arcTo(float left, float top, float right, float bottom,
float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(RectF
oval, float startAngle, float sweepAngle) 画弧形

本条方法和Canvas.drawArc()比起来,少了一个参数useCenter,而多了一个参数forceMoveTo。

少了useCenter,是因为arcTo()只用来画弧形而不画扇形,所以不再须要useCenter参数;而多出去的那个forceMoveTo参数的意思是,绘制是要「抬一下笔移动过去ture」,仍然「直接拖着笔过去false」,分裂在于是不是留下移动的划痕。

11.path.addArc(float left, float top, float right, float bottom, float
startAngle, float sweepAngle) / addArc(RectF oval, float startAngle,
float sweepAngle)

又是一个弧形的不二法门。一个叫arcTo,一个叫addArc(),都是弧形,区别在何地?其实很粗略:addArc()只是一个从来运用了forceMoveTo

true的简化版arcTo()。即,抬起一下笔移动过去,中间有隔断的一部分,不是对接的

12.path.close() 封闭当前子图形

它的效应是把当前的子图形封闭,即由方今义务向当前子图形的起源绘制一条直线。

close()和lineTo(起源坐标)是全然等价的。

13.path.setFillType(FillType fillType)     

顺时针 (CWclockwise) 和逆时针 (CCWcounter-clockwise)
。对于一般意况,这么些参数填CW依然填CCW没有影响。它只是在亟待填写图形(Paint.Style为FILL或FILL_AND_STROKE)
,并且图表出现自相交时,用于判断填充范围的。Path.setFillType(fillType)是用来安装图形自相交时的填写算法的:

FillType的取值有七个:

EVEN_ODD

对此平面中的任意一点,向自由方向射出一条射线,那条射线和图表相交的次数(相交才算,相切不算哦)假设是奇数,则那么些点被认为在图片内部,是要被涂色的区域;如若是偶数,则那么些点被认为在图片外部,是不被涂色的区域。还以左右交接的双圆为例:

澳门金沙国际 36

WINDING(默认值)

首先,它须要您图形中的所有线条都是有绘制方向的:

澳门金沙国际 37

一如既往是从平面中的点向任意方向射出一条射线,但统计规则分歧等:以 0
为早先值,对于射线和图表的所有交点,碰着每个顺时针的交点(图形从射线的左手向右穿过)把结果加
1,碰着每个逆时针的交点(图形从射线的右手向左穿过)把结果减
1,最终把具有的交点都算上,获得的结果若是或不是0,则觉得这些点在图纸内部,是要被涂色的区域;如若是
0,则以为那几个点在图片外部,是不被涂色的区域。

澳门金沙国际 38

图片的取向:对于添加子图形类方法(如Path.addCircle()Path.addRect())的自由化,由艺术的dir参数来支配,那个在前面早已讲过了;而对此画线类的法门(如Path.lineTo()Path.arcTo())就更简短了,线的动向就是图片的动向。

完整版的EVEN_ODD和WINDING的意义应该是这么的

澳门金沙国际 39

INVERSE_EVEN_ODD

INVERSE_WINDING

14.path.drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 画
Bitmap

把bitmap绘制到left,top的坐标点的职位上

15.path.drawText(String text, float x, float y, Paint paint) 绘制文字

在x,y的坐标位置绘制文字内容

可以用paint.setTextSize(float textSize) 设置的文字大小

相关文章