3. 路径(Path)与剪裁(Clipping)
路径是封装了多条几何轮廓的组合。其中可以包含线段,圆,椭圆,二次和三次的贝塞尔曲线。路径的主要应用场景有:绘制复杂的轮廓,也可以通过这些路径进行剪裁,或者在路径上显示文字。
3.1 路径(Path)
3.1.1 绘制复杂轮廓
使用路径可以轻易的生成一段复杂的曲线,因为Path类提供了丰富的函数来实现此功能。下面罗列并简要解释下这些函数。
publicvoid addArc(RectF oval, float startAngle, float sweepAngle)。向路径中添加椭圆弧,此椭圆弧的位置由外接矩形oval定义。startAngle定义开始的角度。sweepAngle定义弧线扫描过的角度。
public void addCircle(float x, float y, float radius, Path.Directiondir)。向路径中添加圆。(x,y)定义圆心的位置。raidus定义圆的半径。dir定义了圆加入路径时的方向。方向由枚举类Path.Direction定义。此参数只用于加入路径的封闭曲线中。
Path.Direction.CCW 逆时针方向。
Path.Direction.CW 顺时针方向。
public void addOval(RectF oval, Path.Direction dir)。向路径中添加椭圆。oval定义了椭圆的位置和大小。Path.Direction定义了椭圆加入路径时的方向。
public void addPath(Path src, float dx, float dy)。将一段路径加入当前路径。(dx,dy)定义了原路径的偏移量。
public void addPath(Path src)。将src所指路径加入当前路径。
public void addPath (Path src, Matrix matrix)。将src所指路径加入当前路径。用matrix所指矩阵进行变换。(变化应用于src还是添加src后的全路径?)
publicvoid addRect(float left, float top, float right, float bottom, Path.Directiondir)。向路径中添加矩形。
public void addRect(RectF rect, Path.Direction dir)。向路径中添加矩形。
publicvoid addRoundRect(RectF rect, float[] radii, Path.Direction dir)。向路径中添加圆角矩形。radii数组定义圆角矩形的四个圆角的x,y半径。radii长度必须为8。
publicvoid addRoundRect(RectF rect, float rx, float ry, Path.Direction dir)。想路径中添加圆角矩形。rx,ry定义了四个圆角的x,y半径。
publicvoid arcTo(RectF oval, float startAngle, float sweepAngle)。向路径中添加一段椭圆弧。
arcTo和addArc的区别在于:
1. 首先,使用addArc可以直接加入一段椭圆弧。而使用arcTo还需要使用moveTo指定当前点的坐标。
2. 对于arcTo来说,如果当前点坐标和欲添加的曲线的起始点不是同一个点的话,还会自动添加一条直线补齐路径。
publicvoid moveTo(float x, float y)。移动当前点到(x,y)。
public void rMoveTo(float dx, float dy)。
publicvoid lineTo(float x, float y)。从当前路径结束点添加一条路径到指定点(x,y)。
public void rLineTo(float dx, float dy)。同LineTo,区别在于LineTo中的(x,y)是对应于坐标原点。而此处(dx,dy)是对应于路径结束点的相对坐标。其他r*函数都类似。
public void quadTo(float x1, float y1, float x2, float y2)。以当前路径结束点为开始点,(x1,y1)为控制点,(x2,y2)为结束点画一条二次贝塞尔曲线。
public void rQuadTo(float dx1, float dy1, float dx2, float dy2)。同quadTo。
public void cubicTo(float x1, float y1, float x2, float y2, float x3,float y3)。以当前路径结束点为开始点,(x1,y1),(x2,y2)为控制点,(x3,y3)为结束点画一条三次贝塞尔曲线。
public void rCubicTo(float x1, float y1, float x2, float y2, float x3,float y3)。同cubicTo。.
下面是相关示例代码和运行效果截图:
package com.example.androidgraphicsprogramm;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
public class PathBasic extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SampleView(this));
}
private static class SampleView extends View {
private Paint mPaint;
Path path;
public SampleView(Context context) {
super(context);
setFocusable(true);
mPaint = new Paint();
path = new Path();
}
@Override protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
drawPath_1(canvas);
drawPath_2(canvas);
}
public void drawPath_1(Canvas canvas) {
Paint paint = mPaint;
int xoffset = 100;
int yoffset = 100;
paint.setColor(Color.GREEN);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawPoint(xoffset,yoffset, paint);
paint.setColor(Color.RED);
canvas.save();
canvas.translate(xoffset, yoffset);
path.reset();
RectF rect = new RectF();
rect.left = 0;
rect.top = 0;
rect.right = rect.left + 200;
rect.bottom = rect.top + 100;
path.addArc(rect, 0,180);
rect.left = 250;
rect.top = 0;
rect.right = rect.left + 200;
rect.bottom = rect.top + 100;
path.addArc(rect, 180, 180);
canvas.drawPath(path, paint);
canvas.restore();