Android--自定义view详解(一)

更新时间:2023-06-18 09:34:04 阅读: 评论:0

Android--⾃定义view详解(⼀)
推荐好看的电视剧
⼀、概述
⾃定义绘制的⽅式是重写绘制⽅法,其中最常⽤的是 onDraw()
绘制的关键是 Canvas 的使⽤
Canvas 的绘制类⽅法: drawXXX() (关键参数:Paint)
Canvas 的辅助类⽅法:范围裁切和⼏何变换
可以使⽤不同的绘制⽅法来控制遮盖关系
火车票电话订票⼆、⾃定义绘制知识的四个级别
1、Canvas 的 drawXXX() 系列⽅法及 Paint 最常见的使⽤Canvas.drawXXX() 是⾃定义绘制最基本的操作。掌握了这些⽅法,你才知道怎么绘制内容,例如怎么画圆、怎么画⽅、怎么画图像和⽂字。组合绘制这些内容,再配合上 Paint 的⼀些常见⽅法来对绘制内容的颜⾊和风格进⾏简单的配置,就能够应付⼤部分的绘制需求了。
2. Paint 的完全攻略
Paint 可以做的事,不只是设置颜⾊,也不只是实⼼空⼼、线条粗细、有没有阴影,它可以做的风格设置真的是⾮常多、⾮常细。例如:拐⾓要什么形状?开不开双线性过滤?加不加特效?等等
3.、Canvas 对绘制的辅助——范围裁切和⼏何变换。
范围裁切:
⼏何变换
4、使⽤不同的绘制⽅法来控制绘制顺序
控制绘制顺序解决的并不是「做不到」的问题,⽽是性能问题。同样的⼀种效果,你不⽤绘制顺序的控制往往也能做到,但需要⽤多个View 甚⾄是多层View 才能拼凑出来,因此代价是 UI 的性能;⽽使⽤绘制顺序的控制的话,⼀个View 就全部搞定了。怎样减肥最健康
三、Canvas.drawXXX() 系列⽅法及 Paint 最基本的使⽤
提前创建好 Paint 对象,重写 onDraw() ,把绘制代码写在 onDraw() ⾥⾯,就是⾃定义绘制最基本的实现。
Paint paint = new Paint();
@Override
protected void onDraw(Canvas canvas) {
// 绘制⼀个圆
canvas.drawCircle(300, 300, 200, paint);
}
注意:别漏写了 Draw()
1. Canvas 类下的所有 draw- 打头的⽅法,例如 drawCircle()和drawBitmap() 。
2. Paint 类的⼏个最常⽤的⽅法。具体是:
Paint.tStyle(Style style) 设置绘制模式
Paint.tColor(int color) 设置颜⾊
Paint.tStrokeWidth(float width) 设置线条宽度
Paint.tTextSize(float textSize) 设置⽂字⼤⼩
Paint.tAntiAlias(boolean aa) 设置抗锯齿开关
下⾯具体说下上⾯两个类:
Canvas.drawColor(@ColorInt int color) 颜⾊填充⽅法:在整个绘制区域统⼀涂上指定的颜⾊。
例如 drawColor(Color.BLACK) 会把整个区域染成纯⿊⾊,覆盖掉原有内容;drawColor(Color.par("#88880000") 会在原有的绘制效果上加⼀层半透明的红⾊遮罩。
类似的⽅法还有 drawRGB(int r, int g, int b) 和drawARGB(int a, int r, int g, int b) ,它们和 drawColor(color) 只是使⽤⽅式不同,作⽤都是⼀样的。
canvas.drawRGB(100, 200, 100);
canvas.drawARGB(100, 100, 200, 100);
这类颜⾊填充⽅法⼀般⽤于在绘制之前设置底⾊,或者在绘制之后为界⾯设置半透明蒙版。
drawCircle(float centerX, float centerY, floatradius, Paint paint) 画圆。
前两个参数 centerX centerY 是圆⼼的坐标,第三个参数 radius 是圆的半径,单位都是像素,它们共同构成了这个圆的基本信息(即⽤这⼏个信息可以构建出⼀个确定的圆);第四个参数 paint,它提供基本信息之外的所有风格信息,例如颜⾊、线条粗细、阴影等。
在 Android ⾥,每个 View 都有⼀个⾃⼰的坐标系,彼此之间是不影响的。这个坐标系的原点是 View 左上⾓的那个点;⽔平⽅
向是 x 轴,右正左负;竖直⽅向是 y 轴,下正上负(注意,是下正上负,不是上正下负,和上学时候学的坐标系⽅向不⼀样)。
所以⼀个 View 的坐标 (x, y) 处,指的就是相对它的左上⾓那个点的⽔平⽅向 x 像素、竖直⽅向 y 像素的点。例如,(300, 300) 指的就是左上⾓的点向右 300 、向下300 的位置; (100, -50) 指的就是左上⾓的点向右 100 、向上 50 的位置。也就是
说,canvas.drawCircle(300, 300, 200, paint) 这⾏代码绘制出的圆,在 View 中的位置和尺⼨应该是这样的:
圆⼼坐标和半径,这些都是圆的基本信息,也是它的独有信息。什么叫独有信息?就是只有它有,别⼈没有的信息。你画圆有圆⼼坐标和半径,画⽅有吗?画椭圆有吗?这就叫独有信息。独有信息都是直接作为参数写进 drawXXX() ⽅法⾥的(⽐如 drawCircle(centerX, centerY, radius, paint) 的前三个参数)。⽽除此之外,其他的都是公有信息。⽐如图形的颜⾊、空⼼实⼼这些,你不管是画圆还是画⽅都有可能⽤到的,这些信息则是统⼀放在 paint 参数⾥的。
Paint.tColor(int color)
paint.tColor(Color.RED); // 设置为红⾊
canvas.drawCircle(300, 300, 200, paint);
Paint.tStyle(Paint.Style style)
⽽如果你想画的不是实⼼圆,⽽是空⼼圆(或者叫环形),也可以使⽤paint.tStyle(Paint.Style.STROKE) 来把绘制模式改为画线模式。
paint.tStyle(Paint.Style.STROKE); // Style 修改为画线模式
canvas.drawCircle(300, 300, 200, paint);
tStyle(Style style) 这个⽅法设置的是绘制的 Style 。 Style 具体来说有三种: FILL , STROKE 和 FILL_AND_STROKE 。 FILL 是填充模式, STROKE 是画线模式(即勾边模式), FILL_AND_STROKE 是两种模式⼀并使⽤:既画线⼜填充。它的
默认值是 FILL ,填充模式。
Paint.tStrokeWidth(float width)
在 STROKE 和 FILL_AND_STROKE 下,还可以使⽤paint.tStrokeWidth(float width) 来设置线条的宽度:
paint.tStyle(Paint.Style.STROKE);
paint.tStrokeWidth(20); // 线条宽度为 20 像素
canvas.drawCircle(300, 300, 200, paint);
抗锯齿
在绘制的时候,往往需要开启抗锯齿来让图形和⽂字的边缘更加平滑。开启抗锯齿很简单,只要在 new Paint() 的时候加上⼀个
ANTI_ALIAS_FLAG 参数就⾏:
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
另外,使⽤ Paint.tAntiAlias(boolean aa) 来动态开关抗锯齿。
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 对象来绘制矩形。小i
drawPoint(float x, float y, Paint paint) 画点郑州景点
x 和 y 是点的坐标。点的⼤⼩可以通过 paint.tStrokeWidth(width) 来设置;点的形状可以通过 paint.tStrokeCap(cap) 来设置:ROUND 画出来是圆形的点, SQUARE 或 BUTT 画出来是⽅形的点。
drawPoints(float[] pts, int offt, int count,Paint paint) / drawPoints(float[] pts, Paintpaint) 画点(批量)
同样是画点,它和 drawPoint() 的区别是可以画多个点。 pts 这个数组是点的坐标,每两个成⼀对; offt 表⽰跳过数组的前⼏个数再开始记坐标; count 表⽰⼀共要绘制⼏个点。
float[] points = {0, 0, 50, 50, 50, 100, 100, 50, 100, 100, 150, 50}
// 绘制四个点:(50, 50) (50, 100) (100, 50) (100, 100)
canvas.drawPoints(points, 2 /* 跳过两个数,即前两个 0 */,
8 /* ⼀共绘制 8 个数(4 个点)*/, paint);
drawOval(float left, float top, float right, float bottom, Paint paint) 画椭圆
只能绘制横着的或者竖着的椭圆,不能绘制斜的(斜的倒是也可以,但不是直接使⽤ drawOval() ,⽽是配合⼏何变换,后⾯会讲到)。left , top , right , bottom是这个椭圆的左、上、右、下四个边界点的坐标。求生类电影
paint.tStyle(Style.FILL);
canvas.drawOval(50, 50, 350, 200, paint);
paint.tStyle(Style.STROKE);
canvas.drawOval(400, 50, 700, 200, paint);
另外,它还有⼀个重载⽅法 drawOval(RectF rect, Paint paint) ,让你可以直接填写 RectF 来绘制椭圆。
drawLine(float startX, float startY, float stopX,float stopY, Paint paint) 画线
canvas.drawPoints(points, 2 /* 跳过两个数,即前两个 0 */,8 /* ⼀共绘制 8 个数(4 个点)*/, paint);startX , startY , stopX ,
stopY 分别是线的起点和终点坐标。
drawLines(float [] pts, int offt, int count,Paint paint) / drawLines(float [] pts, Paint paint) 画线(批量)
drawLines() 是 drawLine() 的复数版。
drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) 画圆⾓矩形
float[] points = {20, 20, 120, 20, 70, 20, 70, 120, 20, 120, 120, 12canvas.drawLines(points, paint);
left , top , right , bottom 是四条边的坐标, rx 和 ry 是圆⾓的横向半径和纵向半径。
drawArc(float left, float top, float right,float bottom,float startAngle, float sweepAngle,boolean uCenter, Paint paint) 绘制弧形或扇形
drawArc() 是使⽤⼀个椭圆来描述弧形的。 left , top , right , bottom 描述的是这个弧形所在的椭圆; startAngle 是弧形的起始⾓度(x 轴的正向,即正右的⽅向,是 0 度的位置;顺时针为正⾓度,逆时针为负⾓度),sweepAngle 是弧形划过的⾓度;uCenter 表⽰是否连接到圆⼼,如果不连接到圆⼼,就是弧形,如果连接到圆⼼,就是扇形。
drawPath(Path path, Paint paint) 画⾃定义图形
drawPath(path) 这个⽅法是通过描述路径的⽅式来绘制图形的,它的 path 参数就是⽤来描述图形路径的对象。 path 的类型是 Path ,使⽤⽅法⼤概像下⾯这样:
public class PathView extends View {
Paint paint = new Paint();
Path path = new Path(); // 初始化 Path 对象
......
{
通话记录查询// 使⽤ path 对图形进⾏描述(这段描述代码不必看懂)
path.addArc(200, 200, 400, 400, -225, 225);
path.arcTo(400, 200, 600, 400, -180, 225, fal);
path.lineTo(400, 542);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawPath(path, paint); // 绘制出 path 描述的图形(⼼形)
}
强制重启
}

本文发布于:2023-06-18 09:34:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1043815.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:绘制   信息   设置   模式   控制
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图