android 图形图像编程- 第三章 路径(Path)和剪切(Clipping)

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();
       
       

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值