您的位置:首页 > 移动开发 > Android开发

android 用Path 绘制各种图形,Path的方法解析

2016-04-11 16:07 489 查看
Path主要用于绘制复杂的图形轮廓,比如折线,圆弧以及各种复杂图案

方法列表:

reset()
                          

lineTo(float x, float y)

moveTo(float x, float y)

close()

path.addArc(oval, startAngle, sweepAngle)

arcTo(RectF oval, float startAngle, float sweepAngle)

quadTo(float x1, float y1, float x2, float y2)

addCircle(float x, float y, float radius, Direction dir)

addOval(RectF oval, Path.Direction dir)

addPath(Path src, float dx, float dy)

Paint初始化操作:

在处理path之前,我们首先对paint做一些初始化操作:
Paint paint = new Paint();
paint.setColor(Color.RED);
//设置画笔宽度
paint.setStrokeWidth(3);
//消除锯齿
paint.setAntiAlias(true);
//设置镂空(方便查看效果)
paint.setStyle(Style.STROKE);reset()方法:reset()清除path设置的所有属性lineTo(float x, float y)方法:lineTo(float x, float y)方法用于从当前轮廓点绘制一条线段到x,y点:从原点开始绘制一条折线,代码如下:Path path = new Path();
path.lineTo(100,100);
path.lineTo(100, 200);
path.lineTo(150, 250);
canvas.drawPath(path, paint);效果图如下:


上图中没有指定 初始轮廓点,默认从0,0点开始

moveTo(float x, float y)方法:

path的moveTo方法将起始轮廓点移至x,y坐标点,默认情况为0,0点

使用moveTo设置轮廓点:代码如下:
Path path = new Path();path.moveTo(20, 200);
path.lineTo(50, 200);
path.lineTo(100, 300);
path.lineTo(200, 350);
canvas.drawPath(path, paint);
效果图如下:



close()方法:

回到初始点形成封闭的曲线

Path path = new Path();path.moveTo(20, 200);
path.lineTo(50, 200);
path.lineTo(100, 300);
path.lineTo(200, 350);
path.close();
canvas.drawPath(path, paint);
效果图如下:



//绘制矩形

Rect rect = new Rect(100, 100, 300, 250);
canvas.drawRect(rect, paint);//绘制椭圆
canvas.drawOval(new RectF(rect), paint);//绘制两条参考线canvas.drawLine(50, 175, 350, 175, paint);canvas.drawLine(200, 50, 200, 300, paint);
addArc(RectF oval, float startAngle, float sweepAngle)方法:path.addArc方法用于绘制圆弧,这个圆弧取自RectF矩形的内接椭圆上的一部分,圆弧长度由后两个参数决定startAngle:起始位置的角度值sweepAngle:旋转的角度值
Rect rect = new Rect(100, 100, 300, 250);
canvas.drawRect(rect, paint);
canvas.drawLine(50, 175, 350, 175, paint);
canvas.drawLine(200, 50, 200, 300, paint);
path.reset();path.addArc(new RectF(rect), 30, 60);
canvas.drawPath(path, paint);效果图如下:

注意:如果path.addArc(new RectF(rect), -90, -90);第一个 -90表示,从 -90度开始绘制,第二个 -90 表示 ,逆时针 绘制 90度。arcTo(RectF oval, float startAngle, float sweepAngle)方法:arcTo和addArc的区别:1. addArc可以直接加入一段椭圆弧。使用arcTo还需要使用moveTo指定当前点的坐标。2. arcTo如果当前点坐标和曲线的起始点不是同一个点的话,还会自动添加一条直线补齐路径。
Rect rect = new Rect(100, 100, 300, 250);
canvas.drawRect(rect, paint);
canvas.drawLine(50, 175, 350, 175, paint);
canvas.drawLine(200, 50, 200, 300, paint);

Path path = new Path();
path.moveTo(0, 0);
path.arcTo(new RectF(rect), 0, 90);
//path.addArc(new RectF(rect), 0, 90);
canvas.drawPath(path, paint);效果图如下:


quadTo(float x1, float y1, float x2, float y2)方法:以当前路径结束点为开始点,(x1,y1)为控制点,(x2,y2)为结束点画一条二次贝塞尔曲线(相关贝赛尔曲线请再做查询)
Path path = new Path();path.moveTo(20, 50);
path.lineTo(50, 200);
path.quadTo(100, 200, 150, 250);
canvas.drawPath(path, paint);


addCircle(float x, float y, float radius, Direction dir)方法:
使用path绘制圆形,xy为圆的圆心 radius为圆的半径,Direction 为绘制元的方向Diection.CCW 逆时针方向Diection.CW 顺时针方向Path path = new Path();path.reset();
path.addCircle(100, 100, 50, Direction.CW);
canvas.drawPath(path, paint);

addOval(RectF oval, Path.Direction dir)方法:

绘制椭圆,同上绘制圆的方法

addPath(Path src, float dx, float dy)方法:

在已有的Path上通过平移创建新的path:

Path path = new Path();
path.lineTo(100,100);
path.lineTo(100, 200);
path.lineTo(150, 250); canvas.drawPath(path, paint);
path.addPath(path, 100, 0);
canvas.drawPath(path, paint);
效果图如下:



1、自定义view 源码:

package com.example.pathview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

public class PathView extends View {

private Paint paint;

public PathView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}

public PathView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}

public PathView(Context context) {
super(context);
init(context, null);
}

private void init(Context context, AttributeSet attrs) {

paint = new Paint();
paint.setColor(Color.RED);
// 设置画笔宽度
paint.setStrokeWidth(3);
// 消除锯齿
paint.setAntiAlias(true);
// 设置镂空(方便查看效果)
paint.setStyle(Style.STROKE);
}

@Override
public void draw(Canvas canvas) {
super.draw(canvas);
// //绘制折线
// Path path = new Path();
// path.lineTo(100,100);
// path.lineTo(100, 200);
// path.lineTo(150, 250);
// path.close();
// canvas.drawPath(path, paint);

// //绘制正方形
// Rect rect = new Rect(100, 100, 300, 250);
// canvas.drawRect(rect, paint);

// //绘制椭圆
// canvas.drawOval(new RectF(rect), paint);
// //绘制线条
// canvas.drawLine(50, 175, 350, 175, paint);
// canvas.drawLine(200, 50, 200, 300, paint);

/**
* addArc(RectF oval, float startAngle, float sweepAngle)方法:
*
* path.addArc方法用于绘制圆弧,这个圆弧取自RectF矩形的内接椭圆上的一部分,圆弧长度由后两个参数决定
*
* startAngle:起始位置的角度值
*
* sweepAngle:旋转的角度值
*
*/

// 绘制圆弧
// Rect rect = new Rect(100, 100, 300, 250);
// Path path = new Path();
// path.reset();
// path.addArc(new RectF(rect), 0, 60);
// canvas.drawPath(path, paint);

/**
* arcTo(RectF oval, float startAngle, float sweepAngle)方法:
* arcTo和addArc的区别:
* 1. addArc可以直接加入一段椭圆弧。使用arcTo还需要使用moveTo指定当前点的坐标。
* 2.arcTo如果当前点坐标和曲线的起始点不是同一个点的话,还会自动添加一条直线补齐路径
*/

// Rect rect = new Rect(100, 100, 300, 250);
// canvas.drawRect(rect, paint);
// canvas.drawLine(50, 175, 350, 175, paint);
// canvas.drawLine(200, 50, 200, 300, paint);
//
// Path path = new Path();
// path.moveTo(0, 0);
// path.moveTo(0, 0);
// path.arcTo(new RectF(rect), 0, 90);
// //path.addArc(new RectF(rect), 0, 90);
// canvas.drawPath(path, paint);

/**
* quadTo(float x1, float y1, float x2, float y2)方法:
* 以当前路径结束点为开始点,(x1,y1)为控制点,(x2,y2)为结束点画一条二次贝塞尔曲线(相关贝赛尔曲线请再做查询)
*/
// Path path = new Path();
//
// path.moveTo(20, 50);
// path.lineTo(50, 200);
// path.quadTo(100, 200, 150, 250);
// canvas.drawPath(path, paint);

/**
* addCircle(float x, float y, float radius, Direction dir)方法:
* 使用path绘制圆形,xy为圆的圆心 radius为圆的半径,
* Direction 为绘制元的方向
* Diection.CCW 逆时针方向Diection.CW 顺时针方向
*/
// Path path = new Path();
//
// path.reset();
// path.addCircle(100, 100, 50, Direction.CW);
// canvas.drawPath(path, paint);

/**
* addOval(RectF oval, Path.Direction dir)方法:
* 绘制椭圆,同上绘制圆的方法
*/

/**
* addPath(Path src, float dx, float dy)方法:
* 在已有的Path上通过平移创建新的path:
*/
Path path = new Path();
path.lineTo(100,100);
path.lineTo(100, 200);
path.lineTo(150, 250);

canvas.drawPath(path, paint);
path.addPath(path, 100, 0);
canvas.drawPath(path, paint);

}
}

2、layout 布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<com.example.pathview.PathView
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</RelativeLayout>

源码下载地址:
http://download.csdn.net/detail/legend12300/9482718
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图形 path